package cn.freemud.management.service.impl;

import cn.freemud.base.entity.BaseResponse;
import cn.freemud.management.entities.dto.request.order.OrderManagerRequest;
import cn.freemud.management.entities.dto.response.order.OrderManagerResponse;
import cn.freemud.management.entities.dto.response.pay.PayRefundResponse;
import cn.freemud.management.enums.ResponseResult;
import cn.freemud.management.service.OrderManagerService;
import cn.freemud.management.service.handle.ActivityHandle;
import cn.freemud.management.service.handle.MallOrderHandle;
import cn.freemud.management.service.handle.PaymentHandle;
import cn.freemud.management.service.handle.StockHandle;
import cn.freemud.management.util.ResponseUtil;
import com.alibaba.fastjson.JSONObject;
import com.freemud.application.sdk.api.log.LogThreadLocal;
import com.freemud.application.sdk.api.ordercenter.entities.v1.OrderBeanV1;
import com.freemud.application.sdk.api.ordercenter.enums.AfterSalesStatus;
import com.freemud.application.sdk.api.ordercenter.enums.PayChannelType;
import com.freemud.application.sdk.api.ordercenter.enums.RefundModeEnum;
import com.freemud.application.sdk.api.ordercenter.request.AfterOrderExtInfoDto;
import com.freemud.application.sdk.api.ordercenter.request.AfterSalesRefundFailReq;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderPayItemResp;
import com.freemud.application.sdk.api.ordercenter.service.OrderSdkService;
import com.freemud.sdk.api.assortment.order.enums.PayRefundStatus;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Objects;

/**
 * All rights Reserved, Designed By www.freemud.cn
 *
 * @version V1.0
 * @Title: rrr
 * @Package cn.freemud.management.service.impl
 * @Description: 新版商城订单履单操作
 * @author:
 * @Copyright: 2020 www.freemud.cn Inc. All rights reserved.
 * 注意：本内容仅限于上海非码科技内部传阅，禁止外泄以及用于其他的商业目
 */
@Service
public class NewMallOrderMangerServiceImpl implements OrderManagerService {
    @Autowired
    private MallOrderHandle mallOrderHandle;
    @Autowired
    private PaymentHandle paymentHandle;
    @Autowired
    private StockHandle stockHandle;
    @Autowired
    private ActivityHandle activityHandle;
    @Autowired
    private OrderSdkService orderSdkService;

    /**
     * 同意退款
     *
     * @param request
     * @param orderBean
     * @return
     */
    @Override
    public BaseResponse<OrderManagerResponse> orderAgreeRefund(OrderManagerRequest request, OrderBeanV1 orderBean) {

        Byte refundMode = RefundModeEnum.UN_REFUND_GOODS.getIndex();
        if(null != orderBean.getAfterSalesOrderResp() && StringUtils.isNotEmpty(orderBean.getAfterSalesOrderResp().getExtInfo())){
            AfterOrderExtInfoDto afterOrderExtInfoDto = JSONObject.parseObject(orderBean.getAfterSalesOrderResp().getExtInfo(),AfterOrderExtInfoDto.class);
            if(null !=afterOrderExtInfoDto) {
                refundMode = afterOrderExtInfoDto.getRefundMode();
            }
        }
        if (Objects.equals(RefundModeEnum.REFUND_ALL.getIndex(), refundMode) && Objects.nonNull(orderBean.getAfterSalesOrderResp()) && Objects.equals(AfterSalesStatus.PENDING.getIndex(), orderBean.getAfterSalesOrderResp().getAfterSalesStatus())) {
            // 修改售后单状态为退货中
            mallOrderHandle.mallOrderAgreeApply(request, orderBean);
        } else {
            //支付退款
            PayRefundResponse refundResponse = this.payRefundCommon(request, orderBean);
            // 退款异常
            if (refundResponse.getPayRefundStatus().getCode().compareTo(PayRefundStatus.COMPATIBILITY_STATUS.getCode()) == 0) {
                return ResponseUtil.error(refundResponse.getResult());
            }
            // fisherman --> 退款中的状态 阻止后续流程 等待支付回调  不是退款成功 都终止下面的退款流程
            if (refundResponse.getPayRefundStatus().getCode().compareTo(PayRefundStatus.SUCCESS.getCode()) != 0) {
                return ResponseUtil.error(ResponseResult.REFUND_FAIL_WAIT_CALLBACK);
            }
//            PayRefundResponse refundResponse;
//            boolean cashPay = false;
//            boolean svcPay = false;
//            if(CollectionUtils.isNotEmpty(orderBean.getOrderPayItem())){
//                for (OrderPayItemResp  payItemResp : orderBean.getOrderPayItem()){
//                    if(Objects.equals(payItemResp.getPayChannelType(),(int)PayChannelType.SVC.getIndex())){
//                        svcPay = true;
//                    }
//                    if(Objects.equals(payItemResp.getPayChannelType(),(int)PayChannelType.WECHAT.getIndex())){
//                        cashPay = true;
//                    }
//                    if(Objects.equals(payItemResp.getPayChannelType(),(int)PayChannelType.ALIPAY.getIndex())){
//                        cashPay = true;
//                    }
//                }
//            }
//            if (cashPay && svcPay) {
//                refundResponse = paymentHandle.multiRefund(orderBean);
//            } else {
//                refundResponse = paymentHandle.getCommonPayRefundResponse(request, orderBean);
//            }
            //订单同意退款
            mallOrderHandle.refundAgree(request, refundResponse, orderBean);
            //冲正库存
            stockHandle.revert(request, orderBean);
        }
        return ResponseUtil.success();
    }

    /**
     * 拒绝退款
     *
     * @param request
     * @param orderBean
     * @return
     */
    @Override
    public BaseResponse<OrderManagerResponse> orderRejectRefund(OrderManagerRequest request, OrderBeanV1 orderBean) {
        //拒绝退款
        mallOrderHandle.mallRefundReject(request,orderBean);
        return ResponseUtil.success();
    }

    /**
     * 拒单
     *
     * @param request
     * @param orderBean
     * @return
     */
    @Override
    public BaseResponse<OrderManagerResponse> orderReject(OrderManagerRequest request, OrderBeanV1 orderBean) {
        return ResponseUtil.error("501","暂无");
    }


    /**
     * 提取 退款公共代码
     *
     * @param request
     * @param orderBean
     * @return
     */
    private PayRefundResponse payRefundCommon(OrderManagerRequest request, OrderBeanV1 orderBean) {
        PayRefundResponse refundResponse = paymentHandle.getCommonPayRefundResponse(request, orderBean);
        //同意退款失败记录到订单售后单
        if (orderBean.getAfterSalesOrderResp() != null && refundResponse.getPayRefundStatus().getCode().compareTo(PayRefundStatus.FAIL.getCode()) == 0) {
            AfterSalesRefundFailReq refundFailReq = new AfterSalesRefundFailReq();
            refundFailReq.setOrderCode(orderBean.getOid());
            refundFailReq.setPartnerId(orderBean.getCompanyId());
            refundFailReq.setRefundFailReason("退款失败或退款中，" + refundResponse.getMessage());
            refundFailReq.setAfterSalesCode(orderBean.getAfterSalesOrderResp().getAfterSalesCode());
            refundFailReq.setOperationClient(request.getOperationClient());
            refundFailReq.setOperator(request.getOperator());
            orderSdkService.refundFail(refundFailReq, LogThreadLocal.getTrackingNo());
        }
        return refundResponse;
    }

}
