package com.red.circle.other.app.dto.cmd.game;

import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import java.util.List;
import lombok.Data;

/**
 * Baishun游戏状态上报.
 *
 * @author tf
 */
@Data
public class GameBaishunReportCmd {

    /** 上报类型: game_start / game_settle */
    @NotBlank
    @JsonProperty("report_type")
    private String reportType;

    /** 上报数据体（对应 game_start_info 或 game_settle_info） */
    @NotNull
    @JsonProperty("report_msg")
    private Object reportMsg;

    /** 用户ID */
    @NotBlank
    @JsonProperty("user_id")
    private String userId;

    /** 用户ss_token */
    @NotBlank
    @JsonProperty("ss_token")
    private String ssToken;

    // -------------------------------------------------------------------------
    // 内嵌数据结构
    // -------------------------------------------------------------------------

    /** 游戏开始上报数据 */
    @Data
    public static class GameStartInfo {

        @JsonProperty("game_id")
        private Integer gameId;

        @JsonProperty("room_id")
        private String roomId;

        @JsonProperty("game_round_id")
        private String gameRoundId;

        /** 开始时间戳（毫秒） */
        @JsonProperty("start_at")
        private Long startAt;

        private List<PlayerStartInfo> players;

        /** 货币类型，app定义，非必填 */
        @JsonProperty("currency_type")
        private Integer currencyType;
    }

    /** 游戏结算上报数据 */
    @Data
    public static class GameSettleInfo {

        @JsonProperty("game_id")
        private Integer gameId;

        @JsonProperty("room_id")
        private String roomId;

        @JsonProperty("game_round_id")
        private String gameRoundId;

        /** 开始时间戳（毫秒） */
        @JsonProperty("start_at")
        private Long startAt;

        /** 结束时间戳（毫秒） */
        @JsonProperty("end_at")
        private Long endAt;

        private List<PlayerResultInfo> players;

        /** 货币类型，app定义，非必填 */
        @JsonProperty("currency_type")
        private Integer currencyType;
    }

    /** 开局玩家信息 */
    @Data
    public static class PlayerStartInfo {

        @JsonProperty("user_id")
        private String userId;

        /** 0: 玩家, 1: 机器人 */
        @JsonProperty("is_ai")
        private Integer isAi;

        /** 扣除数量 */
        private Integer bet;
    }

    /** 结算玩家信息 */
    @Data
    public static class PlayerResultInfo {

        @JsonProperty("user_id")
        private String userId;

        /** 0: 玩家, 1: 机器人 */
        @JsonProperty("is_ai")
        private Integer isAi;

        private Integer rank;

        private Integer reward;

        private Integer score;
    }
}
