package com.ylx.order.domain.dto;

import lombok.Data;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;

/**
 * 订单流转与退款规则配置 DTO
 * 用于接收前端“保存”操作提交的完整配置信息
 */
@Data
public class RegulationConfigDTO {

    // ==================== 1. 订单自动流转配置 ====================

    /**
     * 是否开启自动流转: true-开启, false-关闭
     * 对应 DB: auto_flow_config.is_enabled
     */
    @NotNull(message = "自动流转开关不能为空")
    private Boolean autoFlowEnabled;

    /**
     * 自动流转超时阈值（小时）
     * 对应 DB: auto_flow_config.timeout_hours
     * UI: "用户下单超 [ ] 小时"
     */
    @NotNull(message = "自动流转时间不能为空")
    private BigDecimal timeoutHours;

    /**
     * 系统自动处理动作
     * 对应 DB: auto_flow_config.default_action
     * 0=自动退款 (目前UI只展示了这一个选项，预留扩展)
     */
    private Integer defaultAction;


    // ==================== 2. 退款规则配置 ====================
    // UI 上将退款规则分为了三个主要板块，我们将其封装为内部类列表

    /**
     * 未出发阶段策略
     */
    @NotNull(message = "未出发阶段策略不能为空")
    private Integer preDepartureStrategy; // 0 or 1

    /**
     * 阶段一：商户未出发前 (Stage Type 0)
     * UI 特征：支持多行配置（起始小时 至 结束小时，退款%）
     */
    @Valid
    private List<TimeRangeRuleItem> preDepartureRules;

    /**
     * 阶段二：商户已出发/途中 (Stage Type 1)
     * UI 特征：通常是一个固定比例，或者简单的列表
     */
    @Valid
    private List<SimplePercentRuleItem> onWayRules;

    /**
     * 阶段三：服务进行中 (Stage Type 2)
     * UI 特征：通常是一个固定比例
     */
    @Valid
    private List<SimplePercentRuleItem> inServiceRules;


    // ==================== 内部辅助类 ====================

    /**
     * 时间段规则项 (用于“商户未出发前”)
     * 对应 DB: refund_rule_detail (stage_type=0)
     */
    @Data
    public static class TimeRangeRuleItem {
        /**
         * 距离服务开始时间的起始小时数 (如 24.0)
         * 对应 DB: time_start_hours
         */
        @NotNull(message = "起始小时不能为空")
        private BigDecimal timeStartHours;

        /**
         * 距离服务开始时间的结束小时数 (如 8.0)
         * 对应 DB: time_end_hours
         */
        @NotNull(message = "结束小时不能为空")
        private BigDecimal timeEndHours;

        /**
         * 退款百分比 (如 80.00 代表 80%)
         * 对应 DB: refund_percent
         */
        @NotNull(message = "退款比例不能为空")
        private BigDecimal refundPercent;

        /**
         * 排序权重
         */
        private Integer sortOrder;
    }

    /**
     * 简单比例规则项 (用于“商户已出发”和“服务中”)
     * 对应 DB: refund_rule_detail (stage_type=1 or 2)
     * 注意：这两个阶段通常不涉及复杂的时间窗口，或者时间窗口是隐含的
     */
    @Data
    public static class SimplePercentRuleItem {
        /**
         * 退款类型: 0=全额, 1=部分
         */
        private Integer refundType;

        /**
         * 退款百分比
         */
        @NotNull(message = "退款比例不能为空")
        private BigDecimal refundPercent;

    }
}
