package com.market.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.market.enums.RobotStatus;
import com.market.enums.RobotTrend;
import lombok.Data;

import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 行情机器人配置实体
 * <p>
 * 对应 kucoin 库 config_robot 表，每条记录为一个自定义交易对的机器人配置。
 *
 * @author jean
 * @date 2026-05-11
 */
@Data
@TableName("config_robot")
public class RobotConfig implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    /** 主键 */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    /** 交易对（小写，如 btcusdt） */
    private String symbol;

    /**
     * 趋势方向：1=涨 2=跌 3=横盘
     *
     * @see RobotTrend
     */
    private Integer trend;

    /** 起始参考价格，机器人无历史价格时使用 */
    private BigDecimal openPrice;

    /** 目标价格（NULL 表示无目标，一直趋势运行） */
    private BigDecimal targetPrice;

    /**
     * 盘整区间比例（如 0.02 = 2%）
     * <p>
     * 涨到目标价后：盘整区间 = [targetPrice × (1 - hoverRange), targetPrice]<br>
     * 跌到目标价后：盘整区间 = [targetPrice, targetPrice × (1 + hoverRange)]
     */
    private BigDecimal hoverRange;

    /** 趋势阶段单次最小变动幅度（如 0.001 = 0.1%） */
    private BigDecimal minChangeRate;

    /** 趋势阶段单次最大变动幅度（如 0.005 = 0.5%） */
    private BigDecimal maxChangeRate;

    /** 盘整阶段单次最小变动幅度（如 0.0005 = 0.05%） */
    private BigDecimal hoverMinChangeRate;

    /** 盘整阶段单次最大变动幅度（如 0.002 = 0.2%） */
    private BigDecimal hoverMaxChangeRate;

    /**
     * 上涨概率（0~1），NULL 时由 trend 自动推导：
     * 涨=0.65 / 跌=0.35 / 横盘=0.50
     */
    private BigDecimal upProbability;

    /** 每次生成价格的间隔（毫秒），最小 1 */
    private Integer intervalMs;

    /**
     * 状态：1=趋势运行 2=已停止 3=盘整震荡
     *
     * @see RobotStatus
     */
    private Integer status;

    /**
     * 成桥最小比例（如 0.05 = 5%），NULL 时默认 0.05
     * <p>
     * 每次进入成桥阶段时，在 [bridgeMinRatio, bridgeMaxRatio] 区间内随机取值作为本次桥幅度，
     * 桥完成后下次重新随机，保证每段桥形态不同。
     */
    private BigDecimal bridgeMinRatio;

    /**
     * 成桥最大比例（如 0.10 = 10%），NULL 时默认 0.10
     * <p>
     * 与 bridgeMinRatio 共同决定每次桥的随机幅度区间。
     * 两者均为 0 时不做桥，直接进入盘整。
     */
    private BigDecimal bridgeMaxRatio;

    /**
     * K线最高价最大上涨比例（如 0.02 = 2%），NULL 时默认 0.005
     * <p>
     * 每根K线的 high 不超过 close × (1 + 随机[0, klineMaxHighRatio])
     */
    private BigDecimal klineMaxHighRatio;

    /**
     * K线最低价最大下跌比例（如 0.02 = 2%），NULL 时默认 0.005
     * <p>
     * 每根K线的 low 不低于 close × (1 - 随机[0, klineMaxLowRatio])
     */
    private BigDecimal klineMaxLowRatio;

    /**
     * 分钟K线最大涨跌幅限制（如 0.10 = 10%），NULL 时不限制
     * <p>
     * 每根分钟K线内，价格不超过开盘价 × (1 + limit) 也不低于开盘价 × (1 - limit)。
     * 超出边界时，从边界价格反向生成一个随机步长（桥幅度区间），使价格自然反弹。
     */
    private BigDecimal minuteChangeLimit;

    /** 备注 */
    private String remark;

    /** 创建时间 */
    private LocalDateTime createTime;

    /** 修改时间 */
    private LocalDateTime updateTime;
}
