package com.ecep.contract.model;

import java.io.Serializable;
import java.time.LocalDate;
import java.util.Objects;

import org.hibernate.annotations.ColumnDefault;

import com.ecep.contract.util.HibernateProxyUtils;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import jakarta.persistence.Version;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

/**
 * 公司信息类，保存企业信息
 */
@Getter
@Setter
@Entity
@Table(name = "COMPANY")
@ToString
public class Company implements IdentityEntity, NamedEntity, BasedEntity, Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    /**
     * 公司名称
     */
    private String name;

    /**
     * 统一社会信用代码
     * <p>
     * 编码结构
     * 
     * <pre>
     * 1 | 1 | 6 | 9 | 1 < br > 登记管理部门代码 | 机构类别代码 | 登记管理机关行政区划码 | 主体标识码 | 校验码
     * </pre>
     * <ul>
     * <li>登记管理部门代码（第 1 位）：<br>
     * 例如，9 代表工商部门登记的企业等。</li>
     * <li>机构类别代码（第 2 位）：不同的数字表示不同类型的机构。如 1 表示企业，2 表示个体工商户等。</li>
     * <li>登记管理机关行政区划码（第 3 - 8 位）：这 6 位数字代表了登记管理机关所在的行政区划，与身份证号码的前 6
     * 位类似，可对应到具体的地区。</li>
     * <li>主体标识码（组织机构代码，第 9 - 17
     * 位）：它是对中华人民共和国境内依法注册、依法登记的机关、企事业单位、社会团体和民办非企业单位等机构颁发的一个在全国范围内唯一的、始终不变的代码。</li>
     * </ul>
     * </p>
     */
    @Column(name = "UNISCID", length = 30)
    private String uniscid;
    /**
     * 简称
     */
    @Column(name = "SHORT_NAME")
    private String shortName;
    /**
     * 文件夹存在
     */
    @Column(name = "PATH_EXIST")
    private Boolean pathExist;
    /**
     * 文件夹路径
     */
    @Column(name = "PATH")
    private String path;
    /**
     * 记录创建日期
     */
    @Column(name = "CREATED")
    private LocalDate created;
    /**
     * 企业状态
     */
    @Column(name = "ENT_STATUS")
    private String entStatus;
    /**
     * 企业类型
     */
    @Column(name = "ENT_TYPE")
    private String entType;

    /**
     * 区域
     */
    @Column(name = "DISTRICT")
    private String district;

    /**
     * 行业
     */
    @Column(name = "INDUSTRY")
    private String industry;

    /**
     * 电话
     */
    @Column(name = "TELEPHONE")
    private String telephone;

    /**
     * 注册地址
     */

    @Column(name = "REG_ADDR")
    private String regAddr;

    /**
     * 通讯地址
     */
    @ToString.Exclude
    @Column(name = "ADDRESS")
    private String address;

    /**
     * 成立日期
     */
    @Column(name = "SETUP_DATE")
    private LocalDate setupDate;

    /**
     * 营业期限起始
     */
    @ToString.Exclude
    @Column(name = "OPERATION_PERIOD_BEGIN")
    private LocalDate operationPeriodBegin;

    /**
     * 营业期限截至
     */
    @ToString.Exclude
    @Column(name = "OPERATION_PERIOD_END")
    private LocalDate operationPeriodEnd;

    /**
     * 注册资金
     */
    @ToString.Exclude
    @Column(name = "REGISTERED_CAPITAL")
    private String registeredCapital;

    /**
     * 资本金币种
     */
    @ToString.Exclude
    @Column(name = "REGISTERED_CAPITAL_CURRENCY")
    private String registeredCapitalCurrency;

    /**
     * 法人
     */
    @ToString.Exclude
    @Column(name = "LEGAL_REPRESENTATIVE")
    private String legalRepresentative;

    /**
     * 备注
     */
    @ToString.Exclude
    @Column(name = "MEMO")
    private String memo;

    @Version
    @ColumnDefault("0")
    @Column(name = "VERSION", nullable = false)
    @ToString.Exclude
    private int version;

    @Override
    public String toPrettyString() {
        return getName();
    }

    @Override
    public final boolean equals(Object object) {
        if (this == object)
            return true;
        if (object == null || HibernateProxyUtils.isNotEffectiveClassEquals(this, object))
            return false;
        Company company = (Company) object;
        return getId() != null && Objects.equals(getId(), company.getId());
    }

    @Override
    public final int hashCode() {
        return HibernateProxyUtils.hashCode(this);
    }

}
