package com.bizzan.bitrade.entity;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.persistence.*;

/**
 * 币种主网配置表
 * 管理某个币种与某条主网的关联关系及合约地址，
 * 同一币种可关联多条主网（如 USDT-ERC20 / USDT-TRC20 / USDT-BEP20）。
 *
 * @author auto
 * @date 2026-05-13
 */
@Entity
@Data
@Table(name = "coin_network_config",
       uniqueConstraints = @UniqueConstraint(columnNames = {"coin_name", "network_id"},
               name = "uk_coin_network"))
public class CoinNetworkConfig {

    /** 主键，自增 */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 关联币种名称，对应 coin.name，如 EUSDT / TUSDT / USDT-BEP20
     */
    @ApiModelProperty("币种名称，关联 coin.name")
    @Column(name = "coin_name", nullable = false, length = 20,
            columnDefinition = "varchar(20) comment '币种名称，关联 coin.name'")
    private String coinName;

    /**
     * 关联主网，对应 coin_network.id
     */
    @ApiModelProperty("所属主网")
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "network_id", nullable = false,
                columnDefinition = "bigint comment '主网ID，关联 coin_network.id'")
    private CoinNetwork network;

    /**
     * 代币合约地址（原生币如 ETH/TRX 为空，ERC20/TRC20/BEP20 代币填写合约地址）
     */
    @ApiModelProperty("代币合约地址，原生币为空")
    @Column(name = "contract_address", length = 100,
            columnDefinition = "varchar(100) default null comment '代币合约地址，原生币为空'")
    private String contractAddress;

    /**
     * 平台收款地址（用户充值时转入的地址）
     * 原生币及代币均可配置，为空表示暂未配置收款地址
     */
    @ApiModelProperty("平台收款地址，用户充值时转入此地址")
    @Column(name = "recharge_address", length = 200,
            columnDefinition = "varchar(200) default null comment '平台收款地址'")
    private String rechargeAddress;

    /**
     * 合约精度（链上最小单位位数），用于将链上原始金额转换为实际金额
     * 如 USDT(ERC20/TRC20/BEP20) = 6，ETH/BNB = 18，TRX = 6
     */
    @ApiModelProperty("合约精度，链上原始金额换算用，如 USDT=6，ETH=18")
    @Column(name = "contract_decimals", nullable = false,
            columnDefinition = "int not null default 6 comment '合约精度，链上最小单位换算用'")
    private int contractDecimals = 6;

    /**
     * 入账保留小数位数，金额写入数据库时保留的精度
     * 如 USDT 保留 2 位，ETH 保留 8 位
     */
    @ApiModelProperty("入账保留小数位数，如 USDT=2，ETH=8")
    @Column(name = "scale", nullable = false,
            columnDefinition = "int not null default 2 comment '入账金额保留小数位数'")
    private int scale = 2;

    /** 排序值，值越小越靠前 */
    @ApiModelProperty("排序")
    @Column(columnDefinition = "int default 0 comment '排序'")
    private int sort = 0;

    /** 备注 */
    @ApiModelProperty("备注")
    @Column(length = 255, columnDefinition = "varchar(255) default null comment '备注'")
    private String memo;
}
