package com.fs.erp.converter;

import cn.hutool.core.collection.CollectionUtil;
import com.fs.erp.domain.ErpDeliverys;
import com.fs.erp.domain.ErpOrderQuery;
import com.fs.erp.dto.ErpOrderQueryResponse;
import com.fs.erp.dto.wdt.ErpWdtTradeDTO;
import com.fs.erp.dto.wdt.ErpWdtTradeInfo;
import com.fs.erp.dto.wdt.ErpWdtTradeQueryResponse;
import org.mapstruct.*;
import org.mapstruct.factory.Mappers;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * ERP 订单查询 DTO 映射器.
 * <p>
 * 负责将 网店通（WDT）的订单查询响应 DTO 结构 {@link ErpWdtTradeQueryResponseDTO} 映射到
 * 内部 ERP 订单查询响应 DTO 结构 {@link ErpOrderQueryResponse}。
 * </p>
 * <p>
 * 主要映射逻辑包括：
 * <ul>
 *     <li>顶层响应状态和消息的映射。</li>
 *     <li>将 WDT 订单列表 {@code trades} 映射到内部订单列表 {@code orders}。</li>
 *     <li>将单个 WDT 订单 {@link ErpWdtTradeDTO} 映射到内部订单 {@link ErpOrderQuery}。</li>
 *     <li>根据 WDT 订单状态推导内部订单的布尔状态字段（如：approve, cancle）。</li>
 *     <li>处理数值类型转换（如：BigDecimal 到 Integer/Double）。</li>
 *     <li>处理日期字符串到 Date 对象的转换。</li>
 *     <li>将 WDT 订单的物流信息映射到一个包含单个元素的内部发货列表 {@code deliverys}。</li>
 * </ul>
 *
 * @author xdd
 * @since 2025-02-27
 */
@Mapper
public interface ErpWdtToErpOrderMapper {

    /**
     * Mapper 实例，用于非 Spring 环境。
     */
    ErpWdtToErpOrderMapper INSTANCE = Mappers.getMapper(ErpWdtToErpOrderMapper.class);

    /**
     * 将网店通订单查询响应 DTO 映射到内部 ERP 订单查询响应 DTO。
     *
     * @param source 源对象，网店通订单查询响应 DTO ({@link ErpWdtTradeQueryResponse})。
     * @return 目标对象，内部 ERP 订单查询响应 DTO ({@link ErpOrderQueryResponse})。
     *         如果源对象为 null，则返回 null。
     */

    default ErpOrderQueryResponse toErpOrderQueryResponse(ErpWdtTradeQueryResponse source){
        ErpOrderQueryResponse response = new ErpOrderQueryResponse();
        List<ErpOrderQuery> erpOrderQueryList = new ArrayList<>();
        if(CollectionUtil.isNotEmpty(source.getTrades())){
            List<ErpWdtTradeInfo> trades = source.getTrades();
            for (ErpWdtTradeInfo trade : trades) {
                ErpOrderQuery erpOrderQuery = toErpOrderQuery(trade);
                erpOrderQueryList.add(erpOrderQuery);
            }
        }
        response.setOrders(erpOrderQueryList);
        return response;
    }

    /**
     * 将单个网店通订单 DTO 映射到内部 ERP 订单查询 DTO。
     *
     * @param source 源对象，单个网店通订单 DTO ({@link ErpWdtTradeDTO})。
     * @return 目标对象，内部 ERP 订单查询 DTO ({@link ErpOrderQuery})。
     *         如果源对象为 null，则返回 null。
     */
    default ErpOrderQuery toErpOrderQuery(ErpWdtTradeInfo source){
        ErpOrderQuery erpOrderQuery = new ErpOrderQuery();
        // 订单号
        if(source.getSrcTids() != null) {
            erpOrderQuery.setCode(source.getSrcTids());
        }
        // 商品数量
        if(source.getGoodsCount() != null) {
            erpOrderQuery.setQty(source.getGoodsCount().intValue());
        }
        // 商品金额
        if(source.getGoodsAmount() != null){
            erpOrderQuery.setAmount(source.getGoodsAmount().doubleValue());
        }
        // 支付金额
        if(source.getPaid() != null){
            erpOrderQuery.setPayment(source.getPaid().doubleValue());
        }
        // 快递编号
        if(source.getLogisticsCode() != null){
            erpOrderQuery.setExpress_code(source.getLogisticsCode());
        }
        // 快递名称
        if(source.getLogisticsName() != null) {
            erpOrderQuery.setExpress_name(source.getLogisticsName());
        }

        // 收货人
        if(source.getReceiverName() != null) {
            erpOrderQuery.setReceiver_name(source.getReceiverName());
        }

        // 电话
        if(source.getReceiverMobile() != null) {
            erpOrderQuery.setReceiver_mobile(source.getReceiverMobile());
        }

        //地址
        if(source.getReceiverAddress() != null) {
            erpOrderQuery.setReceiver_address(source.getReceiverAddress());
        }

        // 运单号
        if(source.getLogisticsNo() != null){
            erpOrderQuery.setExpress_code(source.getLogisticsNo());
        }

        ErpDeliverys erpDeliverys = new ErpDeliverys();
        erpDeliverys.setExpress_code(source.getLogisticsCode());
        erpDeliverys.setExpress_name(source.getLogisticsName());
        erpDeliverys.setMail_no(source.getLogisticsNo());

        erpOrderQuery.setDeliverys(new ArrayList<>(Collections.singletonList(erpDeliverys)));
        return erpOrderQuery;
    }


}
