package com.ruoyi.ccdi.project.domain.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.lsfx.domain.response.GetBankStatementResponse.BankStatementItem;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;

import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

/**
 * 银行流水对象 ccdi_bank_statement
 *
 * @author ruoyi
 * @date 2026-03-04
 */
@Data
@TableName("ccdi_bank_statement")
public class CcdiBankStatement implements Serializable {

    private static final Logger log = LoggerFactory.getLogger(CcdiBankStatement.class);

    @Serial
    private static final long serialVersionUID = 1L;

    // ===== 主键和关联字段 =====

    /** 流水ID */
    @TableId(type = IdType.AUTO)
    private Long bankStatementId;

    /** 关联项目ID（业务字段） */
    private Long projectId;

    /** 企业ID */
    private Integer leId;

    /** 账号ID */
    private Long accountId;

    /** 项目id（保留原有字段） */
    private Integer groupId;

    // ===== 账号信息 =====

    /** 企业账号名称 */
    private String leAccountName;

    /** 企业银行账号 */
    private String leAccountNo;

    /** 账号日期ID */
    private Integer accountingDateId;

    /** 账号日期 */
    private String accountingDate;

    /** 交易日期 */
    private String trxDate;

    /** 币种 */
    private String currency;

    // ===== 交易金额 =====

    /** 付款金额 */
    private BigDecimal amountDr;

    /** 收款金额 */
    private BigDecimal amountCr;

    /** 余额 */
    private BigDecimal amountBalance;

    // ===== 交易类型和标志 =====

    /** 交易类型 */
    private String cashType;

    /** 交易标志位 */
    private String trxFlag;

    /** 分类ID */
    private Integer trxType;

    /** 异常类型 */
    private String exceptionType;

    /** 是否为内部交易 */
    private Integer internalFlag;

    // ===== 对手方信息 =====

    /** 对手方企业ID */
    private Integer customerLeId;

    /** 对手方企业名称 */
    private String customerAccountName;

    /** 对手方账号 */
    private String customerAccountNo;

    /** 对手方银行 */
    private String customerBank;

    /** 对手方备注 */
    private String customerReference;

    /** 交易对手方证件号 */
    private String customerCertNo;

    /** 交易对手方统一社会信用代码 */
    private String customerSocialCreditCode;

    // ===== 摘要和备注 =====

    /** 用户交易摘要 */
    private String userMemo;

    /** 银行交易摘要 */
    private String bankComments;

    /** 银行交易号 */
    private String bankTrxNumber;

    // ===== 银行信息 =====

    /** 所属银行缩写 */
    private String bank;

    // ===== 批次和上传信息 =====

    /** 上传logId */
    private Integer batchId;

    /** 每次上传在文件中的line */
    private Integer batchSequence;

    // ===== 附加字段 =====

    /** meta json（固定为null） */
    private String metaJson;

    /** 是否包含余额 */
    private Integer noBalance;

    /** 初始余额 */
    private Integer beginBalance;

    /** 结束余额 */
    private Integer endBalance;

    /** 覆盖标识 */
    private Long overrideBsId;

    /** 交易方式 */
    private String paymentMethod;

    /** 身份证号 */
    private String cretNo;

    // ===== 审计字段 =====

    /** 创建时间 */
    private Date createDate;

    /** 创建者 */
    private Long createdBy;

    /**
     * 从流水分析接口响应转换为实体
     *
     * @param item 流水分析接口返回的流水项
     * @return 流水实体，如果 item 为 null 则返回 null
     */
    public static CcdiBankStatement fromResponse(BankStatementItem item) {
        // 1. 空值检查
        if (item == null) {
            log.warn("流水项为空，无法转换");
            return null;
        }

        try {
            // 2. 创建实体对象
            CcdiBankStatement entity = new CcdiBankStatement();

            // 3. 使用 BeanUtils 复制同名字段
            BeanUtils.copyProperties(item, entity);

            // 4. 手动映射字段名不一致的情况
            entity.setLeAccountNo(item.getAccountNo());
            entity.setCustomerAccountNo(item.getCustomerAccountNo());
            entity.setLeAccountName(item.getLeName());
            entity.setAmountDr(item.getDrAmount());
            entity.setAmountCr(item.getCrAmount());
            entity.setAmountBalance(item.getBalanceAmount());
            entity.setTrxFlag(item.getTransFlag());
            entity.setTrxType(item.getTransTypeId());
            entity.setCustomerLeId(item.getCustomerId());
            entity.setCustomerAccountName(item.getCustomerName());
            entity.setBatchSequence(item.getUploadSequnceNumber());
            entity.setCustomerCertNo(item.getCustomerCertNo());
            entity.setCustomerSocialCreditCode(item.getCustomerSocialCreditCode());
            entity.setCretNo(normalizeCertNo(item.getCretNo()));

            // 5. 特殊字段处理
            entity.setMetaJson(null);  // 根据文档要求强制设为 null

            // 注意：project_id 需要在 Service 层根据业务逻辑设置

            return entity;
        } catch (Exception e) {
            log.error("流水数据转换失败, bankStatementId={}", item.getBankStatementId(), e);
            throw new RuntimeException("流水数据转换失败", e);
        }
    }

    private static String normalizeCertNo(String value) {
        if (value == null || value.isBlank()) {
            return null;
        }
        String normalized = value.trim()
            .replace('－', '-')
            .replace('—', '-')
            .replace('–', '-');
        int separatorIndex = normalized.indexOf('-');
        if (separatorIndex >= 0) {
            normalized = normalized.substring(0, separatorIndex).trim();
        }
        return normalized.isEmpty() ? null : normalized;
    }
}
