package com.ruoyi.system.domain;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.Date;

/**
 * 用户发票抬头 info_invoice（发票信息管理）—— 即请求体 / 响应体。
 * <p>用户级 CRUD，镜像 InfoAddress；JWT 隔离 userId。字段完整说明见
 * specs/014-invoice-profile/contracts/api.md。</p>
 *
 * <p><b>按 category 区分两套入参（列表返回同理，前端按 category 渲染）：</b><br>
 * B2C（个人）：titleName + buyerName + carrierType + carrierNum（载具=2 时再加 buyerEmail）<br>
 * B2B（公司）：titleName + buyerName + buyerUbn + buyerEmail（不传载具）</p>
 *
 * <p>字段格式 / 必填由 jakarta 校验注解声明（@NotBlank/@Pattern/@Email，springfox 自动识别为
 * Swagger 的 required/pattern 展示在 /doc.html）；条件必填（B2C 载具、B2B 统编）与类型互斥
 * 由 service validateInvoiceProfile 强校验。</p>
 *
 * @author foodie
 * @date 2026-07-24
 */
@Data
@TableName(value = "info_invoice")
@EqualsAndHashCode(callSuper = false)
public class InfoInvoice
{
    private static final long serialVersionUID = 1L;

    /** 主键（新增不传，修改必传） */
    @TableId(type = IdType.AUTO)
    private Long id;

    /** 用户id（后端按登录 token 自动填充，前端无需传） */
    private Long userId;

    /** 抬头备注名（用户自定义，便于区分多条抬头） */
    @NotBlank(message = "抬头名称不能为空")
    private String titleName;

    /** 发票类型 B2C=个人 / B2B=公司（区分入参字段与列表渲染的依据） */
    @NotBlank(message = "发票类型不能为空")
    @Pattern(regexp = "B2C|B2B", message = "发票类型只能为 B2C 或 B2B")
    private String category;

    /** 买方名称（B2C 填个人姓名 / B2B 填公司全名） */
    @NotBlank(message = "买方名称不能为空")
    private String buyerName;

    /** 统一编号(统编，8 位数字)；仅 B2B 必填，B2C 不传 */
    @Pattern(regexp = "\\d{8}", message = "统一编号必须为 8 位数字")
    private String buyerUbn;

    /** 接收邮箱；B2B 必填 / B2C 仅载具类型=2(ezPay会员)时必填，其余可空 */
    @Email(message = "邮箱格式不正确")
    private String buyerEmail;

    /** 载具类型 0手机条码 / 1自然人凭证 / 2ezPay会员；仅 B2C 必填，B2B 不传 */
    @Pattern(regexp = "0|1|2", message = "载具类型只能为 0、1、2")
    private String carrierType;

    /** 载具号码（仅 B2C 必填，随 carrierType：0手机条码以/开头；1自然人凭证=2字母+14数字；2 ezPay会员账号） */
    private String carrierNum;

    /** 是否默认载具/抬头（0否 1是；010 Phase 11 全联式「同意设置为默认」用，同一用户仅一条为 1） */
    private Integer isDefault;

    /** 创建时间（DB DEFAULT CURRENT_TIMESTAMP，只读） */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;

    /** 更新时间（DB ON UPDATE CURRENT_TIMESTAMP，只读） */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
}
