package com.eksad.masterdata.domain;

import com.eksad.ddms.common.util.object.EntityObject;
import com.eksad.ddms.common.util.status.DataStatus;
import com.eksad.masterdata.common.listEnum.PickSlipStatusType;
import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.persistence.*;

import javax.validation.constraints.NotNull;
import java.util.Date;
import java.util.Objects;
import java.util.Set;

@NamedStoredProcedureQuery(
        name = "PickSlip.generatePickSlipNumber",
        procedureName = "generate_pickslip_number",
        parameters = {
                @StoredProcedureParameter(name = "dealercode", type = String.class, mode = ParameterMode.IN),
                @StoredProcedureParameter(name = "soid", type = String.class, mode = ParameterMode.IN)
        }
)
@Entity
@Table(name = "TRX_PICKSLIP")
public class PickSlip implements EntityObject<PickSlip> {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "trx_pickslip_gen")
    @SequenceGenerator(name = "trx_pickslip_gen", sequenceName = "trx_pickslip_seq", allocationSize = 1)
    Integer id;

    @Version
    private Long version;

    @NotNull
    private String pickSlipNumber;

    private String salesOrderID;

    private String ahassID;

    private String pickerID;

    @Temporal(TemporalType.TIMESTAMP)
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy HH:mm:ss")
    private Date pickSlipDate;

    @Enumerated(EnumType.STRING)
    private PickSlipStatusType pickSlipStatusType;

    @Enumerated(EnumType.STRING)
    private DataStatus pickSlipStatus;

    @Embedded
    private CreationalSpecification pickSlipCreational;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "pickSlipNumber", referencedColumnName = "id")
    private Set<PickSlipDetail> pickSlipDetails;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "pickSlipNumber", referencedColumnName = "id")
    private Set<PickSlipDetailEV> pickSlipDetailsEV;

    private String posServiceID;

    public PickSlip() {
    }

    public PickSlip(Integer id, String pickSlipNumber, String salesOrderID, String ahassID, String pickerID, Date pickSlipDate, PickSlipStatusType pickSlipStatusType, DataStatus pickSlipStatus, CreationalSpecification pickSlipCreational, Set<PickSlipDetail> pickSlipDetails, Set<PickSlipDetailEV> pickSlipDetailsEV, Long version, String posServiceID) {

        this.id = id;
        this.pickSlipNumber = pickSlipNumber;
        this.salesOrderID = salesOrderID;
        this.ahassID = ahassID;
        this.pickerID = pickerID;
        this.pickSlipDate = pickSlipDate;
        this.pickSlipStatusType = pickSlipStatusType;
        this.pickSlipStatus = pickSlipStatus;
        this.pickSlipCreational = pickSlipCreational;
        this.pickSlipDetails = pickSlipDetails;
        this.pickSlipDetailsEV = pickSlipDetailsEV;
        this.version = version;
        this.posServiceID = posServiceID;
    }


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public PickSlipStatusType getPickSlipStatusType() {
        return pickSlipStatusType;
    }

    public void setPickSlipStatusType(PickSlipStatusType pickSlipStatusType) {
        this.pickSlipStatusType = pickSlipStatusType;
    }

    public String getPickerID() {
        return pickerID;
    }

    public void setPickerID(String pickerID) {
        this.pickerID = pickerID;
    }

    public Date getPickSlipDate() {
        return pickSlipDate;
    }

    public void setPickSlipDate(Date pickSlipDate) {
        this.pickSlipDate = pickSlipDate;
    }

    public DataStatus getPickSlipStatus() {
        return pickSlipStatus;
    }

    public void setPickSlipStatus(DataStatus pickSlipStatus) {
        this.pickSlipStatus = pickSlipStatus;
    }

    public String getPickSlipNumber() {
        return pickSlipNumber;
    }

    public void setPickSlipNumber(String pickSlipNumber) {
        this.pickSlipNumber = pickSlipNumber;
    }

    public String getSalesOrderID() {
        return salesOrderID;
    }

    public void setSalesOrderID(String salesOrderID) {
        this.salesOrderID = salesOrderID;
    }

    public CreationalSpecification getPickSlipCreational() {
        return pickSlipCreational;
    }

    public void setPickSlipCreational(CreationalSpecification pickSlipCreational) {
        this.pickSlipCreational = pickSlipCreational;
    }

    public Set<PickSlipDetail> getPickSlipDetails() {
        return pickSlipDetails;
    }

    public void setPickSlipDetails(Set<PickSlipDetail> pickSlipDetails) {
        this.pickSlipDetails = pickSlipDetails;
    }

    public Set<PickSlipDetailEV> getPickSlipDetailsEV() {
        return pickSlipDetailsEV;
    }

    public void setPickSlipDetailsEV(Set<PickSlipDetailEV> pickSlipDetailsEV) {
        this.pickSlipDetailsEV = pickSlipDetailsEV;
    }

    public String getAhassID() {
        return ahassID;
    }

    public void setAhassID(String ahassID) {
        this.ahassID = ahassID;
    }

    public Long getVersion() {
        return version;
    }

    public void setVersion(Long version) {
        this.version = version;
    }

    public String getPosServiceID() {
        return posServiceID;
    }

    public void setPosServiceID(String posServiceID) {
        this.posServiceID = posServiceID;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 89 * hash + Objects.hashCode(this.id);
        hash = 89 * hash + Objects.hashCode(this.pickSlipNumber);
        hash = 89 * hash + Objects.hashCode(this.salesOrderID);
        hash = 89 * hash + Objects.hashCode(this.ahassID);
        hash = 89 * hash + Objects.hashCode(this.pickerID);
        hash = 89 * hash + Objects.hashCode(this.pickSlipDate);
        hash = 89 * hash + Objects.hashCode(this.pickSlipStatusType);
        hash = 89 * hash + Objects.hashCode(this.pickSlipStatus);
        hash = 89 * hash + Objects.hashCode(this.pickSlipCreational);
        hash = 89 * hash + Objects.hashCode(this.pickSlipDetails);
        hash = 89 * hash + Objects.hashCode(this.pickSlipDetailsEV);
        hash = 89 * hash + Objects.hashCode(this.version);
        hash = 89 * hash + Objects.hashCode(this.posServiceID);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final PickSlip other = (PickSlip) obj;
        if (!Objects.equals(this.id, other.id)) {
            return false;
        }
        return true;
    }

    @Override
    public boolean sameIdentityAs(PickSlip other) {
        return this.equals(other);
    }
}