package com.nbport.zgwl.contractlaunch.dto;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * 合同发起主对象
 *
 * 这里尽量把前后端会直接用到的字段都放在一个 DTO 里，
 * 方便你后续排查和修改，不做过深的分层。
 */
@Data
public class ContractLaunchDto implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    // ==================== 主键与编号 ====================

    /** 主键ID */
    private Long id;

    /** 合同系统唯一编码（本系统生成，格式 CLS-时间戳-随机数） */
    private String contractSysId;

    /** 业务合同编号（如 MM-20260522-1234，前端可手动输入，不传则自动生成） */
    private String contractCode;

    /** 法务系统生成的合同编号（审批通过后法务返回） */
    private String lawContractCode;

    /** 法务系统返回的合同ID（审批通过后法务返回） */
    private String lawContractId;

    // ==================== 合同基本信息 ====================

    /** 合同名称 */
    private String contractName;

    /** 合同类型中文名（如 买卖合同、服务合同） */
    private String contractType;

    /** 合同类型编码（如 MM/GY/ZL，见文档附录字典） */
    private String contractTypeCode;

    /** 合同来源（ECP:结算平台, DSSP:大宗平台） */
    private String contractSource;

    /** 创建方式（template:从模板创建, manual:手动创建） */
    private String creationMode;

    /** 选择的模板ID */
    private Long templateId;

    /** 选择的模板编号 */
    private String templateCode;

    /** 选择的模板名称 */
    private String templateName;

    // ==================== 流程状态 ====================

    /**
     * 合同状态流转：
     * draft → reviewing → (approved→pending_sign / rejected)
     * pending_sign → signing → pending_collect → pending_archive → completed
     */
    private String status;

    /** 审批状态（pending:待审批, approved:已通过, rejected:已驳回） */
    private String approveStatus;

    /** 审批意见/消息 */
    private String approveMessage;

    // ==================== 签章状态 ====================

    /** 签章平台合同ID（浙江CA安全签创建后返回） */
    private String sealContractId;

    /** 签章状态（1:签署中, 2:签署完成, 3:签署失败, null:未发起） */
    private Integer sealContractStatus;

    // ==================== 金额与币种 ====================

    /** 合同标的额（元） */
    private Double contractAmount;

    /** 币种（RMB/USD/HKD/EUR/IDR） */
    private String currencyName;

    /** 合同期限类型（0:固定期限, 1:无固定期限） */
    private String contractPeriodType;

    /** 期限说明（无固定期限时必填） */
    private String periodExplain;

    /** 合同开始日期（前端保存时传 yyyy-MM-dd HH:mm:ss） */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime effectiveStart;

    /** 合同结束日期（前端保存时传 yyyy-MM-dd HH:mm:ss） */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime effectiveEnd;

    /** 付款方式 */
    private String paymentMethod;

    /** 合同主要内容 */
    private String primaryContent;

    /** 金额说明（计价方式为无金额时填写） */
    private String amountExplain;

    /** 计价方式（0:无金额, 1:固定总价, 2:预估总价, 3:无法预估总价, 4:固定单价） */
    private String valuationMode;

    /** 是否需修订条款（1:是, 0:否） */
    private String needAmendments;

    /** 预估金额（计价方式为预估总价时填写） */
    private Double estimatedAmount;

    // ==================== 签署相关 ====================

    /** 签订方式（GZ:公章, HTZYZ:合同专用章, 等） */
    private String sealType;

    /** 文本来源（standardText:推荐文本, exampleText:示范文本, draftBySelf:自行起草, otherText:对方文本） */
    private String textSource;

    /** 授权方式（当签订方式为"公章/合同专用章+被授权人签字"时必填） */
    private String mandateType;

    /** 货类 */
    private String cargoType;

    /** 协助部门名称 */
    private String assistDepartmentName;

    /** 执行人账号（手机号） */
    private String executorAccount;

    /** 创建人手机号 */
    private String creatorPhone;

    /** 二级单位合同编码 */
    private String selfCode;

    /** 补录主合同编码（用于关联主合同，多个用逗号分割） */
    private String mainContractCode;

    /**
     * 签约主体编码，推送法务字段 signingSubjectCode。
     * 与 orgId 分开保存，避免被当前登录人的组织ID覆盖。
     */
    private String signingSubjectCode;

    /**
     * 固定期间日期类型，推送法务字段 dateType：0-年，1-月，2-日
     */
    private String dateType;

    // ==================== 业务标识 ====================

    /** 是否补录合同（1:补录, 2:非补录） */
    private Integer isAddit;

    /** 签署方式（0:纸质合同, 1:电子合同，默认1） */
    private String isElectron;

    /** 收支方向（1:付款, 2:收款, 3:收支双向, 0:无） */
    private String paymentDirection;

    /**
     * 回调推送地址，法务审批完成后回调本系统使用。
     * 真实地址后续可以由配置文件统一生成。
     */
    private String pushUrl;

    /** 是否重大合同（1:是, 0:否） */
    private Integer isMajorContract;

    /** 是否公开招标（1:是, 0:否） */
    private Integer isOpenBidding;

    /** 是否列入当年预算（1:是, 0:否） */
    private Integer isYearBudget;

    /** 是否共享（1:是, 0:否） */
    private String isShare;

    /** 签约主体是否涉外（1:是, 0:否） */
    private String contractNature;

    /** 签约主体是否涉港澳台（1:是, 0:否） */
    private String isSgat;

    /** 是否正常 */
    private String isNormal;

    /** 是否终止 */
    private String isTerminated;

    /** 是否单方协议（Y/N） */
    private String isSingleAgreement;

    /** 招标编号 */
    private String biddingNo;

    /** 公开招标说明 */
    private String openBiddingRemark;

    /** 签订依据说明 */
    private String contractGistRemark;

    /**
     * 额外金额类型，多个用逗号拼接：DJ-定金，YJ-押金，YFK-预付款，BZJ-保证金
     */
    private String ewAmountType;

    /** 定金金额 */
    private Double djAmount;

    /** 押金金额 */
    private Double yjAmount;

    /** 预付款金额 */
    private Double yfkAmount;

    /** 保证金金额 */
    private Double bzjAmount;

    /** 正文/摘要 */
    private String bodySummary;

    /**
     * 模板字段值 JSON。
     * 例如：{"contractName":"xx","businessRemark":"xx"}
     * 这里用字符串存，方便后续新增字段时不用改表结构。
     */
    private String templateFieldValuesJson;

    // ==================== 文件信息 ====================

    /** 合同正文文件名 */
    private String contractTextFileName;

    /** 合同正文文件路径 */
    private String contractTextFilePath;

    /** 合同正文文件类型 */
    private String contractTextFileType;

    /** 合同正文文件大小（字节） */
    private Long contractTextFileSize;

    // ==================== 签署完成信息 ====================

    /** 签署完成后的合同文件名 */
    private String signedFileName;

    /** 签署完成后的合同文件路径 */
    private String signedFilePath;

    /** 签署完成后的合同文件类型 */
    private String signedFileType;

    /** 签署完成后的合同文件大小（字节） */
    private Long signedFileSize;

    /** 在线签章平台原始下载URL（保留原始地址，signedFilePath 存本地路径） */
    private String signedFileUrl;

    /** 未在线签署的原因（线下签署时填写） */
    private String signedOfflineReason;

    // ==================== 签署与归档时间 ====================

    /** 签署日期 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime signDate;

    /** 用印时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime sealDate;

    /** 用印数量，默认为1 */
    private Integer sealQuantity;

    /** 合同生效日期 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime activeDate;

    /** 归档日期 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime archiveDate;

    /** 档案保管人手机号 */
    private String archiveKeeper;

    /** 档案保管单位 */
    private String archiveKeeperUnit;

    /** 档案保管单位编码 */
    private String archiveKeeperUnitCode;

    // ==================== 业务扩展字段（财务提醒） ====================

    /** 开票时间（用于账单开票提醒，提前3天提醒） */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime invoiceDate;

    /** 收款时间（用于应收账款提醒，提前3天提醒） */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime receiveDate;

    /** 提前提醒天数 */
    private Integer remindDays;

    // ==================== 创建信息 ====================

    /** 发起人 */
    private String initiator;

    /** 发起人部门 */
    private String initiatorDept;

    /** 公司名称（当前登录人所在公司） */
    private String companyName;

    /** 公司/组织编码 */
    private String orgId;

    /** 查询范围（personal:个人, company:公司, admin:管理员） */
    private String queryScope;

    /** 创建人 */
    private String createBy;

    /** 创建时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime createTime;

    /** 更新人 */
    private String updateBy;

    /** 更新时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime updateTime;

    /** 删除标记（N:未删除, Y:已删除） */
    private String isDeleted;

    /** 备注 */
    private String remark;

    // ==================== 子表数据（非数据库字段） ====================

    /**
     * 前端表格直接展示用的相对方摘要
     */
    private String counterpartySummary;

    /** 合同方列表（甲方/乙方/丙方等） */
    private List<ContractLaunchPartyDto> partyList = new ArrayList<>();

    /** 附件文件列表（正文/签订依据/其他附件/签署文件/归档文件） */
    private List<ContractLaunchFileDto> fileList = new ArrayList<>();

    /** 履行计划列表 */
    private List<ContractLaunchPlanDto> performancePlans = new ArrayList<>();

    /** 操作日志列表 */
    private List<ContractLaunchLogDto> logList = new ArrayList<>();
}
