package com.bizzan.bitrade.entity;

import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.annotation.JsonFormat;

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

import javax.persistence.*;
import java.io.Serializable;
import java.math.BigDecimal;

@Entity
@Data
@Table
public class ContractOrderEntrust implements Serializable {
	private static final Long serialVersionUID = 102L;

    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
    private Long id;

    private Long contractId; // 合约ID

    private Long memberId; // 用户ID
    
    private Long positionId;

    private String contractOrderEntrustId; // 合约委托订单ID（自动生成）

    @Enumerated(EnumType.ORDINAL)
    @Column(columnDefinition = "int(11) default 1 comment '仓位模式'")
    private ContractOrderPattern patterns; // 0全仓 1逐仓

    @Enumerated(EnumType.ORDINAL)
    @Column(columnDefinition = "int(11) default 0 comment '委托订单类型'")
    private ContractOrderEntrustType entrustType; // 0 开仓 1 平仓 ｜ 与 direction 配合（）

    @Enumerated(EnumType.ORDINAL)
    @Column(columnDefinition = "int(11) default 1 comment '方向'")
    private ContractOrderDirection direction; // 0买 1卖

    @Enumerated(EnumType.ORDINAL)
    private ContractOrderType type; //委托类型 0市价 1限价 2计划委托

    private String symbol;//交易对符号
    private String coinSymbol;//币单位
    private String baseSymbol;//结算单位

    private BigDecimal triggerPrice;// 触发价(委托方式是计划/限价必填)

    private BigDecimal entrustPrice;// 委托价(委托方式是计划/限价必填)
    
    private BigDecimal lossPrice;// 触发价(委托方式是计划/限价必填)

    private BigDecimal lossEntrustPrice;// 委托价(委托方式是计划/限价必填)
    
    private BigDecimal profitPrice;// 触发价(委托方式是计划/限价必填)

    private BigDecimal profitEntrustPrice;// 委托价(委托方式是计划/限价必填)

    private BigDecimal tradedPrice;// 成交均价

    private String principalUnit;// 本金单位（如：USDT）

    @Column(columnDefinition = "decimal(18,8) DEFAULT 0 comment '本金数量'")
    private BigDecimal principalAmount;// 冻结保证金

    @Column(columnDefinition = "decimal(18,8) DEFAULT 0 comment '下单时价'")
    private BigDecimal currentPrice;// 下单时价

    @Column(columnDefinition = "decimal(18,8) DEFAULT 0 comment '开仓手续费'")
    private BigDecimal openFee;// 开仓手续费

    @Column(columnDefinition = "decimal(18,8) DEFAULT 0 comment '开仓手续费'")
    private BigDecimal closeFee;// 平仓手续费

    @Column(columnDefinition = "decimal(18,8) DEFAULT 0 comment '合约面值'")
    private BigDecimal shareNumber;// 合约面值

    @Column(columnDefinition = "decimal(18,8) DEFAULT 0 comment '委托数量'")
    private BigDecimal volume;// 委托数量（张）

    @Column(columnDefinition = "decimal(18,8) DEFAULT 0 comment '委托数量'")
    private BigDecimal tradedVolume;// 成交数量（张）

    @Column(columnDefinition = "decimal(18,8) default 0 comment '盈亏'")
    private BigDecimal profitAndLoss;// 盈亏金额

    private ContractOrderEntrustStatus status;// 0:委托中/1:已撤销/2:委托失败/3:委托成功

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

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Long triggeringTime;//触发时间

    @Column(columnDefinition = "int(2) default 0 comment '是否是计划委托的委托单'")
    private int isFromSpot;// 是否是计划委托的委托单，0：否，1：是

    @Column(columnDefinition = "int(2) default 0 comment '是否是计划委托的委托单'")
    private int isBlast;// 是否是爆仓单，0：否，1：是

    @Column(columnDefinition = "int(2) default 0 comment '是否已返佣'")
    private int isReward;// 是否已返佣，0：否，1：是
    
    @Column(columnDefinition = "int(2) default 0 comment '是否是止盈止损单'")
    private int isCut;// 是否是止盈止损单，0：否，1：是
    
    //@Column(columnDefinition = "int(2) default 0 comment '是否是一键平仓单'")
    //private int isOneClose;// 是否是一键平仓单，0：否，1：是
    
    @Column(columnDefinition = "int(2) default 0 comment '是否是市价全平单'")
    private int isMarketAllClose;// 是否是市价全平单，0：否，1：是
    
    @Column(columnDefinition = "int(2) default 0 comment '是否是限价成交单'")
    private int isLimitPrice;// 是否是限价成交单，0：否，1：是
    
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Long usdtOpenTime;//开仓时间
    
    @Column(columnDefinition = "decimal(18,8) DEFAULT 0 comment '开仓均价'")
    private BigDecimal usdtOpenPrice;// 开仓均价(USDT本位)
    
    @Column(columnDefinition = "int(2) default 0 comment '是否是反向开仓单'")
    private int isReversedOpen;// 是否是反向开仓单，0：否，1：是
    
    @Column(columnDefinition = "int(6) comment '杠杆'")
    private Integer leverage;// 杠杆
    
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Long dealTime;//成交时间
    
    @ApiModelProperty("仓位类型 INTEGRAL合仓 SEPARATE分仓")
    private ContractPositionType positionType;
    private ContractMoneyType moneyType;
    @ApiModelProperty("开仓类型 0市价委托 1限价委托 2计划委托")
    private Integer openType;
    @ApiModelProperty("平仓类型 CLOSE平仓 MARKET_CLOSE市价全平 ONE_KEY_CLOSE一键平仓 REVERSE_OPEN反向开仓 CUT止盈止损 BLAST爆仓 ADMIN_CLOSE管理员强平")
	private CloseType closeType;
	@ApiModelProperty("委托数量精度")
	private Integer decimalScale;
	
	private Integer isPercentage;
	
	private Integer violateTime;
	@ApiModelProperty("跟随仓位ID")
	private Long followId;
	@ApiModelProperty("跟单系统ID")
	private Long followSystemId;
	@ApiModelProperty("分润比例和分润金额")
	private BigDecimal dividendPercent;
	private Integer isSpecial;
	
	private int triggerCounter;
	private Integer cutType;
	private Integer isAdd;
	private Long hedgeId;

	@ApiModelProperty("关联体验金券ID，NULL=普通订单，非NULL=体验金模式委托单")
	private Long experienceRecordId;
	
	private BigDecimal percentageVolume;
	private BigDecimal minFollowAmount;
    private BigDecimal maxFollowAmount;

    @ApiModelProperty("仓位类型展示标签：全仓 / 分仓 / 体验金")
    public String getPositionTypeLabel() {
        if (this.experienceRecordId != null) return "体验金";
        if (ContractPositionType.SEPARATE.equals(this.positionType)) return "分仓";
        return "全仓";
    }

    @Override
    public String toString() {
        return JSON.toJSONString(this);
    }
}
