package kr.itn.itnhub.org;

import kr.itn.itnhub.contact.Contact;

public class Organization {

    private Long id;
    private String orgNo;
    private String orgName;
    private String channelSlug;
    private Long applicantContactId;
    private Long mjContactId;
    private Long itnContactId;
    private Long lawyerContactId;
    private String lawyerAssignedDate;
    private String channelIdMj;
    private String channelIdLaw;

    /** findAll/findById가 contact 테이블과 조인해 채워준다. 시드/upsert 경로에서는 비어 있다. */
    private Contact applicant;
    private Contact mj;
    private Contact itn;
    private Contact lawyer;

    /**
     * 상태는 저장하지 않고 항상 파생한다.
     * 저장하면 채널ID와 상태가 어긋나는 순간이 생기고, 그 어긋남을 고칠 방법이 없다.
     */
    public OrgStatus getStatus() {
        boolean mjActive = filled(channelIdMj);
        boolean lawActive = filled(channelIdLaw);

        if (mjActive && lawActive) {
            return OrgStatus.ACTIVE;
        }
        if (mjActive || lawActive) {
            return OrgStatus.PARTIAL;
        }
        return hasApplicantAssigned() ? OrgStatus.READY : OrgStatus.INFO_PENDING;
    }

    /** 신청기관 담당자가 배정되어야 채널을 만들 수 있다(담당자관리에서 등록·배정된 담당자). */
    public boolean hasApplicantAssigned() {
        return applicantContactId != null;
    }

    private static boolean filled(String value) {
        return value != null && !value.isBlank();
    }

    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }

    public String getOrgNo() { return orgNo; }
    public void setOrgNo(String orgNo) { this.orgNo = orgNo; }

    public String getOrgName() { return orgName; }
    public void setOrgName(String orgName) { this.orgName = orgName; }

    public String getChannelSlug() { return channelSlug; }
    public void setChannelSlug(String channelSlug) { this.channelSlug = channelSlug; }

    public Long getApplicantContactId() { return applicantContactId; }
    public void setApplicantContactId(Long applicantContactId) { this.applicantContactId = applicantContactId; }

    public Long getMjContactId() { return mjContactId; }
    public void setMjContactId(Long mjContactId) { this.mjContactId = mjContactId; }

    public Long getItnContactId() { return itnContactId; }
    public void setItnContactId(Long itnContactId) { this.itnContactId = itnContactId; }

    public Long getLawyerContactId() { return lawyerContactId; }
    public void setLawyerContactId(Long lawyerContactId) { this.lawyerContactId = lawyerContactId; }

    public String getLawyerAssignedDate() { return lawyerAssignedDate; }
    public void setLawyerAssignedDate(String lawyerAssignedDate) { this.lawyerAssignedDate = lawyerAssignedDate; }

    public String getChannelIdMj() { return channelIdMj; }
    public void setChannelIdMj(String channelIdMj) { this.channelIdMj = channelIdMj; }

    public String getChannelIdLaw() { return channelIdLaw; }
    public void setChannelIdLaw(String channelIdLaw) { this.channelIdLaw = channelIdLaw; }

    public Contact getApplicant() { return applicant; }
    public void setApplicant(Contact applicant) { this.applicant = applicant; }

    public Contact getMj() { return mj; }
    public void setMj(Contact mj) { this.mj = mj; }

    public Contact getItn() { return itn; }
    public void setItn(Contact itn) { this.itn = itn; }

    public Contact getLawyer() { return lawyer; }
    public void setLawyer(Contact lawyer) { this.lawyer = lawyer; }
}
