package com.starry.admin.modules.order.module.dto;

import com.starry.admin.modules.order.module.constant.OrderConstant;
import com.starry.admin.modules.order.module.constant.OrderConstant.RewardType;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import lombok.Builder;
import lombok.Data;

/**
 * 订单创建请求对象 - 使用Builder模式替换20+参数的方法
 *
 * @author admin
 */
@Data
@Builder
public class OrderCreationRequest {

    /**
     * 订单ID
     */
    @NotBlank(message = "订单ID不能为空")
    private String orderId;

    /**
     * 订单编号
     */
    @NotBlank(message = "订单编号不能为空")
    private String orderNo;

    /**
     * 订单状态
     */
    @NotNull(message = "订单状态不能为空")
    private OrderConstant.OrderStatus orderStatus;

    /**
     * 订单类型
     */
    @NotNull(message = "订单类型不能为空")
    private OrderConstant.OrderType orderType;

    /**
     * 下单类型
     */
    @NotNull(message = "下单类型不能为空")
    private OrderConstant.PlaceType placeType;

    /**
     * 打赏类型（0:余额;1:礼物）
     */
    private RewardType rewardType;

    /**
     * 是否是首单
     */
    private boolean isFirstOrder;

    /**
     * 商品信息
     */
    @Valid
    @NotNull(message = "商品信息不能为空")
    private CommodityInfo commodityInfo;

    /**
     * 支付信息
     */
    @Valid
    @NotNull(message = "支付信息不能为空")
    private PaymentInfo paymentInfo;

    /**
     * 下单人
     */
    @NotBlank(message = "下单人不能为空")
    private String purchaserBy;

    /**
     * 接单人（可选）
     */
    private String acceptBy;

    /**
     * 微信号码
     */
    private String weiChatCode;

    /**
     * 订单备注
     */
    private String remark;

    /**
     * 随机单要求（仅随机单时需要）
     */
    private RandomOrderRequirements randomOrderRequirements;

    /**
     * 获取首单标识字符串（兼容现有系统）
     */
    public String getFirstOrderString() {
        return isFirstOrder ? "1" : "0";
    }

    /**
     * 验证随机单要求
     */
    public boolean isValidForRandomOrder() {
        return placeType == OrderConstant.PlaceType.RANDOM
               && randomOrderRequirements != null;
    }

    /**
     * 是否为打赏单
     */
    public boolean isRewardOrder() {
        return placeType == OrderConstant.PlaceType.REWARD;
    }

    /**
     * 是否为指定单
     */
    public boolean isSpecifiedOrder() {
        return placeType == OrderConstant.PlaceType.SPECIFIED;
    }
}
