package com.seer.teach.mall.context;

import lombok.Data;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 订单操作日志上下文持有者
 *
 * @author Captain
 */
public class OrderLogContextHolder {

    /**
     * 订单日志信息
     */
    @Data
    public static class OrderLogInfo {
        /**
         * 订单ID
         */
        private Integer orderId;

        /**
         * 子订单ID
         */
        private Integer childOrderId;

        /**
         * 用户ID
         */
        private Integer userId;

        /**
         * 商家ID
         */
        private Long merchantId;

        /**
         * 操作类型
         */
        private Integer operateType;

        /**
         * 操作内容
         */
        private String content;

        /**
         * 用户类型
         */
        private Integer userType;

        /**
         * 发货状态
         */
        private Integer shippingStatus;

        /**
         * 评论状态
         */
        private Integer commentStatus;

        /**
         * 变更前状态
         */
        private Integer beforeStatus;

        /**
         * 变更后状态
         */
        private Integer afterStatus;

        /**
         * 扩展信息
         */
        private Map<String, Object> extendMap;
    }

    private static final ThreadLocal<List<OrderLogInfo>> CONTEXT_HOLDER = new ThreadLocal<>();

    /**
     * 获取订单日志信息列表
     */
    public static List<OrderLogInfo> getOrderLogInfoList() {
        return CONTEXT_HOLDER.get();
    }

    /**
     * 获取或创建日志信息对象列表
     */
    public static List<OrderLogInfo> getOrCreateLogInfoList() {
        List<OrderLogInfo> logInfoList = CONTEXT_HOLDER.get();
        if (logInfoList == null) {
            logInfoList = new ArrayList<>();
            CONTEXT_HOLDER.set(logInfoList);
        }
        return logInfoList;
    }

    /**
     * 添加订单日志信息
     */
    public static void addLogInfo(OrderLogInfo logInfo) {
        List<OrderLogInfo> logInfoList = getOrCreateLogInfoList();
        logInfoList.add(logInfo);
    }

    /**
     * 获取订单日志信息
     */
    public static OrderLogInfo getOrderLogInfo() {
        List<OrderLogInfo> logInfoList = CONTEXT_HOLDER.get();
        if (logInfoList != null && !logInfoList.isEmpty()) {
            return logInfoList.get(logInfoList.size() - 1);
        }
        return null;
    }

    /**
     * 获取或创建日志信息对象
     */
    public static OrderLogInfo getOrCreateLogInfo() {
        List<OrderLogInfo> logInfoList = getOrCreateLogInfoList();
        if (logInfoList.isEmpty()) {
            OrderLogInfo logInfo = new OrderLogInfo();
            logInfoList.add(logInfo);
            return logInfo;
        }
        return logInfoList.get(logInfoList.size() - 1);
    }

    /**
     * 设置商家ID
     * @param merchantId 商家ID
     */
    public static void setMerchantId(Long merchantId) {
        OrderLogInfo logInfo = getOrCreateLogInfo();
        logInfo.setMerchantId(merchantId);
    }

    /**
     * 清除上下文
     */
    public static void clear() {
        CONTEXT_HOLDER.remove();
    }
}