package com.erp.invoice.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;

/**
 * 发票实体类
 * 
 * 发票管理全生命周期：
 * - 申请：客户提交开票申请
 * - 开具：审核通过后开具发票
 * - 作废：发票开错或需作废
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("invoices")
public class Invoice {
    
    // ==================== 主键和租户 ====================
    
    @TableId(type = IdType.AUTO)
    private Long id;
    
    /**
     * 租户ID
     */
    private Long tenantId;
    
    // ==================== 发票基本信息 ====================
    
    /**
     * 发票号码（电子发票号）
     */
    private String invoiceNo;
    
    /**
     * 发票代码（税务局分配）
     */
    private String invoiceCode;
    
    /**
     * 发票类型：1-增值税专用发票, 2-增值税普通发票, 3-电子发票, 4-卷式发票
     */
    private Integer invoiceType;
    
    /**
     * 发票状态：0-待审核, 1-已开具, 2-已作废, 3-已红冲
     */
    private Integer status;
    
    // ==================== 开票信息 ====================
    
    /**
     * 购方名称（购买方公司名称）
     */
    private String buyerName;
    
    /**
     * 购方纳税人识别号
     */
    private String buyerTaxNo;
    
    /**
     * 购方地址电话
     */
    private String buyerAddressPhone;
    
    /**
     * 购方银行账号
     */
    private String buyerBankAccount;
    
    /**
     * 销方名称（销售方公司名称）
     */
    private String sellerName;
    
    /**
     * 销方纳税人识别号
     */
    private String sellerTaxNo;
    
    /**
     * 销方地址电话
     */
    private String sellerAddressPhone;
    
    /**
     * 销方银行账号
     */
    private String sellerBankAccount;
    
    // ==================== 金额信息 ====================
    
    /**
     * 价税合计金额
     */
    private BigDecimal totalAmount;
    
    /**
     * 不含税金额（金额）
     */
    private BigDecimal amount;
    
    /**
     * 税额
     */
    private BigDecimal taxAmount;
    
    /**
     * 税率（如 0.13 表示13%）
     */
    private BigDecimal taxRate;
    
    // ==================== 关联信息 ====================
    
    /**
     * 关联订单ID
     */
    private Long orderId;
    
    /**
     * 关联订单号
     */
    private String orderNo;
    
    /**
     * 关联客户ID
     */
    private Long customerId;
    
    /**
     * 客户名称
     */
    private String customerName;
    
    // ==================== 发票内容 ====================
    
    /**
     * 发票项目（商品/服务名称汇总）
     */
    private String invoiceContent;
    
    /**
     * 开票人
     */
    private String drawer;
    
    /**
     * 复核人
     */
    private String reviewer;
    
    /**
     * 收款人
     */
    private String payee;
    
    // ==================== 时间信息 ====================
    
    /**
     * 开票日期
     */
    private LocalDate invoiceDate;
    
    /**
     * 申请日期
     */
    private LocalDate applyDate;
    
    /**
     * 作废/红冲日期
     */
    private LocalDate voidDate;
    
    // ==================== 原因和备注 ====================
    
    /**
     * 作废/红冲原因
     */
    private String voidReason;
    
    /**
     * 备注
     */
    private String remark;
    
    // ==================== 文件路径 ====================
    
    /**
     * 电子发票PDF路径
     */
    private String pdfPath;
    
    /**
     * 电子发票图片路径
     */
    private String imagePath;
    
    // ==================== 操作人信息 ====================
    
    /**
     * 申请人ID
     */
    private Long applicantId;
    
    /**
     * 申请人名称
     */
    private String applicantName;
    
    /**
     * 审核人ID
     */
    private Long auditorId;
    
    /**
     * 审核人名称
     */
    private String auditorName;
    
    /**
     * 开票人ID
     */
    private Long issuerId;
    
    /**
     * 开票人名称
     */
    private String issuerName;
    
    // ==================== 时间戳字段 ====================
    
    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createdAt;
    
    /**
     * 更新时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updatedAt;
    
    /**
     * 删除时间（逻辑删除）
     */
    @TableLogic
    private LocalDateTime deletedAt;
    
    // ==================== 枚举值常量 ====================
    
    public static final Integer STATUS_PENDING = 0;      // 待审核
    public static final Integer STATUS_ISSUED = 1;       // 已开具
    public static final Integer STATUS_VOIDED = 2;       // 已作废
    public static final Integer STATUS_REVERSED = 3;     // 已红冲
    
    public static final Integer TYPE_SPECIAL = 1;        // 增值税专用发票
    public static final Integer TYPE_NORMAL = 2;         // 增值税普通发票
    public static final Integer TYPE_ELECTRONIC = 3;     // 电子发票
    public static final Integer TYPE_ROLL = 4;           // 卷式发票
    
    // ==================== 辅助方法 ====================
    
    /**
     * 判断发票是否可作废
     */
    public boolean canBeVoided() {
        return STATUS_ISSUED.equals(this.status);
    }
    
    /**
     * 判断发票是否可红冲
     */
    public boolean canBeReversed() {
        return STATUS_ISSUED.equals(this.status);
    }
    
    /**
     * 判断发票是否已作废或红冲
     */
    public boolean isVoidedOrReversed() {
        return STATUS_VOIDED.equals(this.status) || STATUS_REVERSED.equals(this.status);
    }
    
    /**
     * 获取发票类型名称
     */
    public String getInvoiceTypeName() {
        if (invoiceType == null) return "";
        switch (invoiceType) {
            case 1: return "增值税专用发票";
            case 2: return "增值税普通发票";
            case 3: return "电子发票";
            case 4: return "卷式发票";
            default: return "未知";
        }
    }
    
    /**
     * 获取发票状态名称
     */
    public String getStatusName() {
        if (status == null) return "";
        switch (status) {
            case 0: return "待审核";
            case 1: return "已开具";
            case 2: return "已作废";
            case 3: return "已红冲";
            default: return "未知";
        }
    }
}
