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

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.starry.admin.common.conf.StringTypeHandler;
import com.starry.admin.modules.order.module.constant.OrderConstant.OrderStatus;
import com.starry.admin.modules.order.service.impl.OrderLifecycleServiceImpl;
import com.starry.common.domain.BaseEntity;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;

/**
 * 订单对象 order_info
 *
 * @author admin
 * @since 2024-03-20
 */
@Data
@EqualsAndHashCode(callSuper = false)

@TableName(value = "play_order_info", autoResultMap = true)
public class PlayOrderInfoEntity extends BaseEntity<PlayOrderInfoEntity> {

    /**
     * uuid
     */
    private String id;

    /**
     * 订单编号
     */
    private String orderNo;

    /**
     * 租户ID
     */
    private String tenantId;

    /**
     * 订单状态【0:1:2:3:4】 0：已下单（待接单） 1：已接单（待开始） 2：已开始（服务中） 3：已完成 4：已取消
     */
    private String orderStatus;

    /**
     * 订单类型【-1:退款订单;0:充值订单；1:提现订单；2:普通订单】
     */
    private String orderType;

    /**
     * 下单类型（-1:其他类型;0:指定单;1:随机单;2:打赏单）
     */
    private String placeType;

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

    /**
     * 是否是首单【0：不是，1：是】
     */
    private String firstOrder;

    /**
     * 退款类型【0：未退款，1：已退款】
     */
    private String refundType;

    /**
     * 退款金额
     */
    private BigDecimal refundAmount;

    /**
     * 退款原因
     */
    private String refundReason;

    /**
     * 商品ID
     */
    private String commodityId;

    /**
     * 商品类型[0:礼物，1：服务]
     */
    private String commodityType;
    /**
     * 商品单价
     */
    private BigDecimal commodityPrice;

    /**
     * 商品属性-服务时长
     **/
    private String serviceDuration;

    /**
     * 商品名称
     */
    private String commodityName;

    /**
     * 商品数量
     */
    private String commodityNumber;

    /**
     * 订单要求
     */
    @TableField(typeHandler = StringTypeHandler.class)
    private List<String> labels;

    /**
     * 是否使用优惠券[0:未使用,1:已使用]
     */
    private String useCoupon;

    /**
     * 优惠券列表
     */
    @TableField(typeHandler = StringTypeHandler.class)
    private List<String> couponIds;

    /**
     * 是否是客服录入订单[0:不是,1:是]
     */
    private String backendEntry;

    /**
     * 支付来源（区分余额、三方、盲盒奖励等）。
     */
    private String paymentSource;

    /**
     * 盲盒奖励引用ID。
     */
    private String sourceRewardId;

    /**
     * 支付方式，0：余额支付,1:微信支付,2:支付宝支付
     */
    private String payMethod;

    /**
     * 支付状态,[-1:支付失败,0:未支付;1:支付完成]
     */
    private String payState;

    /**
     * 支付消息
     */
    private String payMsg;

    /**
     * 订单金额
     */
    private BigDecimal orderMoney;

    /**
     * 订单最终金额（支付金额）
     */
    private BigDecimal finalAmount;

    /**
     * 店员预计收入
     */
    private BigDecimal estimatedRevenue;

    /**
     * 店员收入比例
     */
    private Integer estimatedRevenueRatio;

    /**
     * 优惠金额
     *
     * @since 2024/5/13 11:45
     **/
    private BigDecimal discountAmount;

    /**
     * 下单人
     */
    private String purchaserBy;

    /**
     * 下单时间
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime purchaserTime;

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

    /**
     * 是否需要审核，0:不需要，1:需要
     */
    private String reviewRequired;

    /**
     * 审核状态（0:未审核，1:已通过，2:不通过）
     */
    private String reviewState;

    /**
     * 审核人
     */
    private String reviewedBy;

    /**
     * 审核时间
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime reviewedTime;

    /**
     * 审核内容
     */
    private String reviewedRemark;

    /**
     * 接单人
     */
    private String acceptBy;

    /**
     * 订单分组ID（和接单人同一个分组,接单时设置）
     */
    private String groupId;

    /**
     * 接单时间
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime acceptTime;

    /**
     * 开始时间
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime orderStartTime;

    /**
     * 结束时间
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime orderEndTime;

    /**
     * 取消时间
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime orderCancelTime;

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

    /**
     * 后台备注
     */
    private String backendRemark;

    /**
     * 订单结算状态(0:未结算;1:已结算)
     */
    private String orderSettlementState;

    /**
     * 订单结算时间
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime orderSettlementTime;

    /**
     * 订单超时状态(0:未超时;1:已超时)
     */
    private String ordersExpiredState;

    /**
     * 随机单要求-店员性别（0:未知;1:男;2:女）
     */
    private String sex;

    /**
     * 随机单要求-店员等级ID
     */
    private String levelId;

    /**
     * 随机单要求-是否排除下单过的成员（0:不排除;1:排除）
     */
    private String excludeHistory;

    private BigDecimal profitSharingAmount;

    public PlayOrderInfoEntity() {

    }

    public PlayOrderInfoEntity(String id, String orderStatus) {
        this.id = id;
        this.orderStatus = orderStatus;
    }

    public PlayOrderInfoEntity(String id, String orderStatus, String orderType, String placeType) {
        this.id = id;
        this.orderStatus = orderStatus;
        this.orderType = orderType;
        this.placeType = placeType;
    }

    /**
     * 请使用 OrderCompletionService 统一处理订单完成逻辑，直接设置状态仅限初始化或遗留代码。
     */
    @Deprecated
    public void setOrderStatus(String orderStatus) {
        this.orderStatus = orderStatus;
    }

    /**
     * 请使用 OrderCompletionService 统一处理订单结束时间写入。
     */
    @Deprecated
    public void setOrderEndTime(LocalDateTime orderEndTime) {
        this.orderEndTime = orderEndTime;
    }

    /**
     * 更新订单生命周期状态，仅允许订单生命周期服务进行访问。
     *
     * @param token 授权令牌
     * @param orderStatus 新的订单状态
     * @param orderEndTime 可选的订单结束时间
     */
    public void updateOrderStatus(OrderLifecycleServiceImpl.LifecycleToken token, OrderStatus orderStatus) {
        if (token == null) {
            throw new IllegalStateException("Lifecycle token is required");
        }
        if (orderStatus == null) {
            throw new IllegalArgumentException("orderStatus cannot be null");
        }
        this.orderStatus = orderStatus.getCode();
    }

    public void updateOrderEndTime(OrderLifecycleServiceImpl.LifecycleToken token, LocalDateTime orderEndTime) {
        if (token == null) {
            throw new IllegalStateException("Lifecycle token is required");
        }
        if (orderEndTime == null) {
            throw new IllegalArgumentException("orderEndTime cannot be null");
        }
        this.orderEndTime = orderEndTime;
    }
}
