package io.delphiplatform.api.v3.model.gras;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

import java.util.Objects;

import io.delphiplatform.api.v3.rdb.entity.ParentRepertoireOwnerEntity;
import io.delphiplatform.api.v3.rdb.entity.RepertoireOwnerEntity;

/**
 * Repertoire Owner response object
 */
@JsonPropertyOrder(alphabetic = true)
public class RepertoireOwner {

    @JsonProperty("rep_owner_key")
    private String repOwnerKey;

    @JsonProperty("rep_owner_company")
    private Company repOwnerCompany;

    @JsonProperty("is_particip_rep_owner")
    private Boolean isParticipRepOwner;

    @JsonProperty("is_product_rep_owner")
    private Boolean isProductRepOwner;

    @JsonProperty("is_project_rep_owner")
    private Boolean isProjectRepOwner;

    @JsonProperty("is_track_rep_owner")
    private Boolean isTrackRepOwner;

    @JsonProperty("label_id")
    private String labelId;

    @JsonProperty("label_name")
    private String labelName;

    @JsonProperty("profit_center_key")
    private String profitCenterKey;

    @JsonProperty("profit_center_company")
    private Company profitCenterCompany;

    @JsonProperty("parent_rep_owner_key")
    private String parentRepOwnerKey;

    @JsonProperty("parent_rep_owner_company")
    private Company parentRepOwnerCompany;

    public static RepertoireOwner from(RepertoireOwnerEntity entity) {
        if (entity == null) {
            return null;
        }
        ParentRepertoireOwnerEntity parentRepOwnerKey =
            entity.getProfitCenter() == null ? null : entity.getProfitCenter().getParentRepertoireOwner();
        return new RepertoireOwner()
            .repOwnerKey(entity.getRepOwnerKey())
            .repOwnerCompany(Company.from(entity.getRepertoireOwnerCompany()))
            .isParticipRepOwner(entity.isParticipRepOwner())
            .isProductRepOwner(entity.isProdRepOwner())
            .isProjectRepOwner(entity.isRecProjectRepOwner())
            .isTrackRepOwner(entity.isTrackRepOwner())
            .labelId(entity.getLabel() == null ? null : entity.getLabel().getLabelId())
            .labelName(entity.getLabel() == null ? null : entity.getLabel().getName())
            .profitCenterKey(entity.getProfitCenter() == null ? null : entity.getProfitCenter().getProfitCenterKey())
            .profitCenterCompany(entity.getProfitCenter() == null ? null
                : Company.from(entity.getProfitCenter().getProfitCenterCompany()))
            .parentRepOwnerKey(parentRepOwnerKey == null ? null : parentRepOwnerKey.getParentRepOwnerKey())
            .parentRepOwnerCompany(
                parentRepOwnerKey == null ? null : Company.from(parentRepOwnerKey.getParentRepertoireOwnerCompany()));
    }

    public RepertoireOwner repOwnerKey(String repOwnerKey) {
        this.repOwnerKey = repOwnerKey;
        return this;
    }

    /**
     * Primary key identifier for a Company, also used via RepertoireOwner, ParentRepertoireOwner and ProfitCenter.
     *
     * @return repOwnerKey
     */
    public String getRepOwnerKey() {
        return repOwnerKey;
    }

    public void setRepOwnerKey(String repOwnerKey) {
        this.repOwnerKey = repOwnerKey;
    }

    public RepertoireOwner repOwnerCompany(Company repOwnerCompany) {
        this.repOwnerCompany = repOwnerCompany;
        return this;
    }

    /**
     * Get repOwnerCompany
     *
     * @return repOwnerCompany
     */
    public Company getRepOwnerCompany() {
        return repOwnerCompany;
    }

    public void setRepOwnerCompany(Company repOwnerCompany) {
        this.repOwnerCompany = repOwnerCompany;
    }

    public RepertoireOwner isParticipRepOwner(Boolean isParticipRepOwner) {
        this.isParticipRepOwner = isParticipRepOwner;
        return this;
    }

    /**
     * True if the Repertoire Owner is a particip Repertoire Owner.
     *
     * @return isParticipRepOwner
     */
    public Boolean getIsParticipRepOwner() {
        return isParticipRepOwner;
    }

    public void setIsParticipRepOwner(Boolean isParticipRepOwner) {
        this.isParticipRepOwner = isParticipRepOwner;
    }

    public RepertoireOwner isProductRepOwner(Boolean isProductRepOwner) {
        this.isProductRepOwner = isProductRepOwner;
        return this;
    }

    /**
     * True if the Repertoire Owner is a product Repertoire Owner.
     *
     * @return isProductRepOwner
     */
    public Boolean getIsProductRepOwner() {
        return isProductRepOwner;
    }

    public void setIsProductRepOwner(Boolean isProductRepOwner) {
        this.isProductRepOwner = isProductRepOwner;
    }

    public RepertoireOwner isProjectRepOwner(Boolean isProjectRepOwner) {
        this.isProjectRepOwner = isProjectRepOwner;
        return this;
    }

    /**
     * True if the Repertoire Owner is a project Repertoire Owner.
     *
     * @return isProjectRepOwner
     */
    public Boolean getIsProjectRepOwner() {
        return isProjectRepOwner;
    }

    public void setIsProjectRepOwner(Boolean isProjectRepOwner) {
        this.isProjectRepOwner = isProjectRepOwner;
    }

    public RepertoireOwner isTrackRepOwner(Boolean isTrackRepOwner) {
        this.isTrackRepOwner = isTrackRepOwner;
        return this;
    }

    /**
     * True if the Repertoire Owner is a track Repertoire Owner.
     *
     * @return isTrackRepOwner
     */
    public Boolean getIsTrackRepOwner() {
        return isTrackRepOwner;
    }

    public void setIsTrackRepOwner(Boolean isTrackRepOwner) {
        this.isTrackRepOwner = isTrackRepOwner;
    }

    public RepertoireOwner labelId(String labelId) {
        this.labelId = labelId;
        return this;
    }

    /**
     * Primary key identifier for a Label
     *
     * @return labelId
     */
    public String getLabelId() {
        return labelId;
    }

    public void setLabelId(String labelId) {
        this.labelId = labelId;
    }

    public RepertoireOwner labelName(String labelName) {
        this.labelName = labelName;
        return this;
    }

    /**
     * Name of the label
     *
     * @return labelName
     */
    public String getLabelName() {
        return labelName;
    }

    public void setLabelName(String labelName) {
        this.labelName = labelName;
    }

    public RepertoireOwner profitCenterKey(String profitCenterKey) {
        this.profitCenterKey = profitCenterKey;
        return this;
    }

    /**
     * Primary key identifier for a Company, also used via RepertoireOwner, ParentRepertoireOwner and ProfitCenter.
     *
     * @return profitCenterKey
     */
    public String getProfitCenterKey() {
        return profitCenterKey;
    }

    public void setProfitCenterKey(String profitCenterKey) {
        this.profitCenterKey = profitCenterKey;
    }

    public RepertoireOwner profitCenterCompany(Company profitCenterCompany) {
        this.profitCenterCompany = profitCenterCompany;
        return this;
    }

    /**
     * Get profitCenterCompany
     *
     * @return profitCenterCompany
     */
    public Company getProfitCenterCompany() {
        return profitCenterCompany;
    }

    public void setProfitCenterCompany(Company profitCenterCompany) {
        this.profitCenterCompany = profitCenterCompany;
    }

    public RepertoireOwner parentRepOwnerKey(String parentRepOwnerKey) {
        this.parentRepOwnerKey = parentRepOwnerKey;
        return this;
    }

    /**
     * Primary key identifier for a Company, also used via RepertoireOwner, ParentRepertoireOwner and ProfitCenter.
     *
     * @return parentRepOwnerKey
     */
    public String getParentRepOwnerKey() {
        return parentRepOwnerKey;
    }

    public void setParentRepOwnerKey(String parentRepOwnerKey) {
        this.parentRepOwnerKey = parentRepOwnerKey;
    }

    public RepertoireOwner parentRepOwnerCompany(Company parentRepOwnerCompany) {
        this.parentRepOwnerCompany = parentRepOwnerCompany;
        return this;
    }

    /**
     * Get parentRepOwnerCompany
     *
     * @return parentRepOwnerCompany
     */
    public Company getParentRepOwnerCompany() {
        return parentRepOwnerCompany;
    }

    public void setParentRepOwnerCompany(Company parentRepOwnerCompany) {
        this.parentRepOwnerCompany = parentRepOwnerCompany;
    }


    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        RepertoireOwner repertoireOwner = (RepertoireOwner) o;
        return Objects.equals(this.repOwnerKey, repertoireOwner.repOwnerKey) &&
            Objects.equals(this.repOwnerCompany, repertoireOwner.repOwnerCompany) &&
            Objects.equals(this.isParticipRepOwner, repertoireOwner.isParticipRepOwner) &&
            Objects.equals(this.isProductRepOwner, repertoireOwner.isProductRepOwner) &&
            Objects.equals(this.isProjectRepOwner, repertoireOwner.isProjectRepOwner) &&
            Objects.equals(this.isTrackRepOwner, repertoireOwner.isTrackRepOwner) &&
            Objects.equals(this.labelId, repertoireOwner.labelId) &&
            Objects.equals(this.profitCenterKey, repertoireOwner.profitCenterKey) &&
            Objects.equals(this.profitCenterCompany, repertoireOwner.profitCenterCompany) &&
            Objects.equals(this.parentRepOwnerKey, repertoireOwner.parentRepOwnerKey) &&
            Objects.equals(this.parentRepOwnerCompany, repertoireOwner.parentRepOwnerCompany);
    }

    @Override
    public int hashCode() {
        return Objects.hash(repOwnerKey, repOwnerCompany, isParticipRepOwner, isProductRepOwner, isProjectRepOwner,
            isTrackRepOwner, labelId, profitCenterKey, profitCenterCompany, parentRepOwnerKey, parentRepOwnerCompany);
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("class RepertoireOwner {\n");

        sb.append("    repOwnerKey: ").append(toIndentedString(repOwnerKey)).append("\n");
        sb.append("    repOwnerCompany: ").append(toIndentedString(repOwnerCompany)).append("\n");
        sb.append("    isParticipRepOwner: ").append(toIndentedString(isParticipRepOwner)).append("\n");
        sb.append("    isProductRepOwner: ").append(toIndentedString(isProductRepOwner)).append("\n");
        sb.append("    isProjectRepOwner: ").append(toIndentedString(isProjectRepOwner)).append("\n");
        sb.append("    isTrackRepOwner: ").append(toIndentedString(isTrackRepOwner)).append("\n");
        sb.append("    labelId: ").append(toIndentedString(labelId)).append("\n");
        sb.append("    labelName: ").append(toIndentedString(labelName)).append("\n");
        sb.append("    profitCenterKey: ").append(toIndentedString(profitCenterKey)).append("\n");
        sb.append("    profitCenterCompany: ").append(toIndentedString(profitCenterCompany)).append("\n");
        sb.append("    parentRepOwnerKey: ").append(toIndentedString(parentRepOwnerKey)).append("\n");
        sb.append("    parentRepOwnerCompany: ").append(toIndentedString(parentRepOwnerCompany)).append("\n");
        sb.append("}");
        return sb.toString();
    }

    /**
     * Convert the given object to string with each line indented by 4 spaces (except the first line).
     */
    private String toIndentedString(Object o) {
        if (o == null) {
            return "null";
        }
        return o.toString().replace("\n", "\n    ");
    }

}

