package com.ywt.mg.services;

import com.ywt.mg.core.utils.Checker;
import com.ywt.mg.core.utils.DateUtil;
import com.ywt.mg.domain.models.ConstantDef;
import com.ywt.mg.domain.models.enums.*;
import com.ywt.mg.domain.ywtDrugEntities.PrescriptionInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;

@Service
public class CommonServices {

    @Autowired
    private UserService userService;


    /**
     * 得到公司后台的处方状态
     * 平台处方+太和药房：状态：待支付、待取药、配送中、不通过、已退费、待评价、已评价、已过期、退费中
     * 平台处方+广三生殖药房：状态：待支付、待取药、已退费、已完成、已过期、退费中
     * his处方+广三生殖药房+如意坊大药房：待支付、待取药、已退费、已完成、已过期、退费中
     *
     * @param p 处方单
     * @return 处方状态
     */

    public String getCompanyPrescriptionStatusStr(PrescriptionInfo p) {
        int paymentStatusInt = Checker.getIntegerValue(p.getPaymentStatus());

        if (!Checker.isNone(p.getRefundStatus()) && p.getRefundStatus().equals(RefundStatusEnum.PENDING.getValue())) {
            return "退费中";
        }

        // 只要不是支付成功，那则返回："待支付"
        if (paymentStatusInt != PaymentStatusEnum.Success.getValue()) {
            // 计算支付时间
            Date sixDayBefore = DateUtil.getRelativeDate(ConstantDef.OVERDUE_DAY_NUM);
            // todo 平台处方（广三his处方）+ 广三生殖药房，超过3天未支付，算已过期 ，换句话说：只要是广三生殖药房的处方，超过3天未支付，算过期，有些未支付的未选择药房的，也按照这个标准算
            // todo 2020-06-08:太和药房，也增加已过期状态（3天未支付，则过期）
            if (sixDayBefore.after(p.getCreateOn())) {
                return "已过期";
            }
            return PaymentStatusEnum.Pending.getDisplayName();
        }

        int extStatus = Checker.getIntegerValue(p.getExtStatus());
        String statusStr = PrescriptionInfoStatusEnum.valueOf(p.getStatus()).getDisplayName();
        // 太和药房ID
        if (p.getPharmacyId() == ConstantDef.TAIHE_PHARMACY_ID || p.getPharmacyId() == ConstantDef.NFBY_PHARMACY_ID) {
            // 已退费
            if (p.getStatus() == PrescriptionInfoStatusEnum.HaveARefund.getValue()) {
                statusStr = PrescriptionInfoStatusEnum.HaveARefund.getDisplayName();
                return statusStr;
            }
            if ((extStatus & PrescriptionInfoExtStatusEnum.Evaluate.getValue()) == PrescriptionInfoExtStatusEnum.Evaluate.getValue()) {
                statusStr = "已评价";
                return statusStr;
            }

            // 不通过
            if ((extStatus & PrescriptionInfoExtStatusEnum.PresNoPass.getValue()) == PrescriptionInfoExtStatusEnum.PresNoPass.getValue()) {
                statusStr = "不通过";
                return statusStr;
            }
            int deliveryMethodInt = Checker.getIntegerValue(p.getDeliveryMethod());
            // 顺丰返回完成状态或者自取且已发药
            if (p.getStatus() == PrescriptionInfoStatusEnum.Finished.getValue() ||
                    (deliveryMethodInt == DeliveryMethodEnum.SelfPickUp.getValue() && (extStatus & PrescriptionInfoExtStatusEnum.IsSendOut.getValue()) == PrescriptionInfoExtStatusEnum.IsSendOut.getValue())) {
                statusStr = "待评价";
                return statusStr;
            } else {
                // 快递到家
                if (deliveryMethodInt == DeliveryMethodEnum.HomeDelivery.getValue()) {
                    return "配送中";
                } else {
                    return "待取药";
                }
            }
        }

        if ((Checker.getIntegerValue(p.getDeliveryMethod()) == DeliveryMethodEnum.SelfPickUp.getValue() && Checker.getIntegerValue(p.getStatus()) == PrescriptionInfoStatusEnum.Dispatching.getValue())
                || (Checker.getIntegerValue(p.getSource()) == PrescriptionInfoSourceEnum.GY3Y.getValue() && Checker.getIntegerValue(p.getStatus()) == PrescriptionInfoStatusEnum.Dispatching.getValue())) {
            statusStr = "待取药";
        }
        // 已退费
        if (p.getStatus() == PrescriptionInfoStatusEnum.HaveARefund.getValue()) {
            statusStr = PrescriptionInfoStatusEnum.HaveARefund.getDisplayName();
            return statusStr;
        }
        // 单独处理国控药房的 "待取药" 状态
        if (p.getPharmacyId() == ConstantDef.GK_PHARMACY_ID && p.getPaymentStatus() == PaymentStatusEnum.Success.getValue()) {
            return "待取药";
        }
        return statusStr;
    }


    /**
     * 得到药房客户端、医院后台的处方状态
     *
     * @param p {@link PrescriptionInfo}
     * @return 处方状态
     */
//    public String getPrescriptionInfoStatusStr(PrescriptionInfo p) {
//        int currentPharmacyId = userService.getPharmacyId();
//        int pharmacyId = Checker.getIntegerValue(p.getPharmacyId());
//        // todo:目前来说，药房ID为1、4、5的是广三的，其它暂定太和的，当需要新开药房时，需要再做处理
//        // 目前来说，广三生殖药房可以看到其他几个药房的，所以需要针对广三生殖药房单独做处理，后续做广三药房版本（互联网医院v4.3.6（广三处方优化-开放其它药房））时，需要再做调整
//        if (currentPharmacyId == 1 || pharmacyId == 1 || pharmacyId == 4 || pharmacyId == 5 || pharmacyId == 12 || pharmacyId == 13 || pharmacyId == 14) {
////        if ((pharmacyId == p.getPharmacyId()) && (pharmacyId == 1 || pharmacyId == 4 || pharmacyId == 5|| pharmacyId == 18 || pharmacyId == 19)) {
//            return getPrescriptionInfoStatusStrForGS(p);
//        } else if (pharmacyId == p.getPharmacyId() && (pharmacyId == ConstantDef.GK_PHARMACY_ID)) {
//            // 10表示国控来的处方单
//            return getPrescriptionInfoStatusStrForGK(p);
//        } else if (pharmacyId == p.getPharmacyId() && (pharmacyId == ConstantDef.NFBY_PHARMACY_ID)) {
//            // 11表示白云药房处方单
//            return getPrescriptionInfoStatusStrForBY(p);
//        }
//        return getPrescriptionInfoStatusStrForTH(p);
//    }

//
//    /**
//     * 太和药房客户端、太和后台管理系统
//     * <p>
//     * 平台处方+太和药房：状态：待报到、待捡药、已发药、不通过、已退费、退费中
//     *
//     * @param p 处方记录
//     * @return 处方状态
//     */
//    public String getPrescriptionInfoStatusStrForTH(PrescriptionInfo p) {
//        if (Checker.isNone(p)) {
//            return "";
//        }
//        // 处理退费中的状态
//        if (!Checker.isNone(p.getRefundStatus()) && p.getRefundStatus().equals(RefundStatusEnum.PENDING.getValue())) {
//            return "退费中";
//        }
//        // 处理退款的状态
//        if (p.getStatus() == PrescriptionInfoStatusEnum.HaveARefund.getValue()) {
//            return PrescriptionInfoStatusEnum.HaveARefund.getDisplayName();
//        }
//        // 处理不通过的状态
//        int extStatusInt = Checker.getIntegerValue(p.getExtStatus());
//        if ((extStatusInt & PrescriptionInfoExtStatusEnum.PresNoPass.getValue()) == PrescriptionInfoExtStatusEnum.PresNoPass.getValue()) {
//            return PrescriptionInfoExtStatusEnum.PresNoPass.getDisplayName();
//        }
//        // 如果是快递患者，药师筛选的状态有“待捡药、已发药“，如果是自取患者，药师筛选的状态有“待报到、待捡药、已发药“
//        int deliveryMethodInt = Checker.getIntegerValue(p.getDeliveryMethod());
//        // 快递到家
//        if (deliveryMethodInt == DeliveryMethodEnum.HomeDelivery.getValue()) {
//            if ((extStatusInt & PrescriptionInfoExtStatusEnum.IsSendOut.getValue()) == PrescriptionInfoExtStatusEnum.IsSendOut.getValue()) {
//                return "已发药";
//            } else {
//                return "待捡药";
//            }
//        }
//        // 自取
//        else if (deliveryMethodInt == DeliveryMethodEnum.SelfPickUp.getValue()) {
//            if ((extStatusInt & PrescriptionInfoExtStatusEnum.IsSendOut.getValue()) == PrescriptionInfoExtStatusEnum.IsSendOut.getValue()) {
//                return "已发药";
//            } else if ((extStatusInt & PrescriptionInfoExtStatusEnum.IsCheckIn.getValue()) == PrescriptionInfoExtStatusEnum.IsCheckIn.getValue()) {
//                return "待捡药";
//            } else {
//                return "待报到";
//            }
//        }
//        return "";
//    }
//
//
//    /**
//     * 广三药房客户端：获取广三的处方状态
//     * <p>
//     * 广三his处方_广三生殖药房：状态：待支付、待取药、已退费、已完成、已过期
//     * his处方+广三生殖药房+如意坊大药房：状态：待支付、待取药、已退费、已完成、已过期、退费中
//     *
//     * @param p 处方记录
//     * @return 处方状态
//     */
//    public String getPrescriptionInfoStatusStrForGS(PrescriptionInfo p) {
//        if (Checker.isNone(p)) {
//            return "";
//        }
//        // 处理退费中的状态
//        if (!Checker.isNone(p.getRefundStatus()) && p.getRefundStatus().equals(RefundStatusEnum.PENDING.getValue())) {
//            return "退费中";
//        }
//        String statusStr = PrescriptionInfoStatusEnum.valueOf(p.getStatus()).getDisplayName();
//        if (Checker.getIntegerValue(p.getStatus()) == PrescriptionInfoStatusEnum.Dispatching.getValue()) {
//            statusStr = "待取药";
//        }
//        return statusStr;
//    }
//
//
//    /**
//     * 国控药房客户端：获取his的处方状态
//     * <p>
//     * 药房客户端：
//     * <p>
//     * 状态：待支付、待取药、已退费、已过期
//     *
//     * @param p 处方记录
//     * @return 处方状态
//     */
//    private String getPrescriptionInfoStatusStrForGK(PrescriptionInfo p) {
//        if (Checker.isNone(p)) {
//            return "";
//        }
//        // 处理退款的状态
//        if (p.getStatus() == PrescriptionInfoStatusEnum.HaveARefund.getValue()) {
//            return PrescriptionInfoStatusEnum.HaveARefund.getDisplayName();
//        }
//        // 处理支付成功的状态
//        int paymentStatusInt = Checker.getIntegerValue(p.getPaymentStatus());
//        if (paymentStatusInt == PaymentStatusEnum.Success.getValue()) {
//            return "待取药";
//        }
//        // 处理过期状态，3天未支付就过期
//        if (paymentStatusInt != PaymentStatusEnum.Success.getValue()) {
//            // 计算支付时间
//            Date sixDayBefore = DateUtil.getRelativeDate(ConstantDef.OVERDUE_DAY_NUM);
//            if (sixDayBefore.after(p.getCreateOn())) {
//                return "已过期";
//            }
//        }
//        // 其他则返回："待支付"
//        return "待支付";
//    }
//
//    /***
//     * 白云药房
//     * @param p
//     * @return
//     */
//    private String getPrescriptionInfoStatusStrForBY(PrescriptionInfo p) {
//        if (Checker.isNone(p)) {
//            return "";
//        }
//        // 处理退款的状态
//        if (p.getStatus() == PrescriptionInfoStatusEnum.HaveARefund.getValue()) {
//            return PrescriptionInfoStatusEnum.HaveARefund.getDisplayName();
//        }
//        // 处理支付成功的状态
//        int paymentStatusInt = Checker.getIntegerValue(p.getPaymentStatus());
//        int extStatusInt = Checker.getIntegerValue(p.getExtStatus());
//        if (paymentStatusInt == PaymentStatusEnum.Success.getValue()) {
//            if ((extStatusInt & PrescriptionInfoExtStatusEnum.IsSendOut.getValue()) == PrescriptionInfoExtStatusEnum.IsSendOut.getValue()) {
//                return "已发药";
//            } else if (extStatusInt < 1) {
//                return "待取药";
//            }
//        }
//        // 处理过期状态，3天未支付就过期
//        else {
//            // 计算支付时间
//            Date sixDayBefore = DateUtil.getRelativeDate(ConstantDef.OVERDUE_DAY_NUM);
//            if (sixDayBefore.after(p.getCreateOn())) {
//                return "已过期";
//            }
//        }
//
//        if((extStatusInt & PrescriptionInfoExtStatusEnum.PresNoPass.getValue()) == PrescriptionInfoExtStatusEnum.PresNoPass.getValue()) {
//            return  "不通过";
//
//        }
//        // 其他则返回："待支付"
//        return "待支付";
//    }

    /**
     * 广三药房客户端：获取广三的处方状态
     * <p>
     * 广三his处方_广三生殖药房：状态：待支付、待取药、已退费、已完成、已过期
     * his处方+广三生殖药房+如意坊大药房：状态：待支付、待取药、已退费、已完成、已过期、退费中
     *
     * @param p 处方记录
     * @return 处方状态
     */
    public String getPrescriptionInfoStatusStrForGS(PrescriptionInfo p) {
        if (Checker.isNone(p)) {
            return "";
        }
        // 处理退费中的状态
        if (!Checker.isNone(p.getRefundStatus()) && p.getRefundStatus().equals(RefundStatusEnum.PENDING.getValue())) {
            return "退费中";
        }
        String statusStr = PrescriptionInfoStatusEnum.valueOf(p.getStatus()).getDisplayName();
        if (Checker.getIntegerValue(p.getStatus()) == PrescriptionInfoStatusEnum.Dispatching.getValue()) {
            statusStr = "待取药";
        }
        return statusStr;
    }


}
