/*
 * File: src/main/java/purchase/model/PurchaseItem.java
 * Description: This model represents individual items within a Purchase. Each PurchaseItem
 * captures details such as product ID, quantity, and tenant information, and maintains a reference
 * to the associated Purchase. The model includes metadata fields for tracking creation, updates,
 * and deletions, allowing a complete record of each item within a purchase order.
*/

package com.nebula.erp.purchase.model;

import jakarta.persistence.*;
import com.fasterxml.jackson.annotation.JsonBackReference;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.EqualsAndHashCode;

import java.time.Instant;

@Getter
@Setter
@Entity
@Table(name = "purchase_item")
@ToString(exclude = { "purchase_order" })
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class PurchaseItem {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @EqualsAndHashCode.Include
  private Long id;

  @ManyToOne
  @JoinColumn(name = "purchase_id")
  @JsonBackReference
  private Purchase purchase_order;

  @Column(nullable = false)
  private Long product_id;

  @Column(nullable = false)
  private Integer quantity;

  @Column(nullable = false)
  private String created_by;

  @Column(nullable = false)
  private String tenant;

  @Column(nullable = false)
  private Boolean is_grn = false;

  @Column(nullable = false, updatable = false)
  private Instant created_at;

  @Column(nullable = false)
  private Instant updated_at;

  private Instant deleted_at;

  @PrePersist
  protected void onCreate() {
    Instant now = Instant.now();
    created_at = now;
    updated_at = now;
  }

  @PreUpdate
  protected void onUpdate() {
    updated_at = Instant.now();
  }
}