package com.pz.web.task;

import cn.hutool.core.util.RandomUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.pz.common.utils.spring.SpringUtils;
import com.pz.merchant.domain.Company;
import com.pz.merchant.domain.Employees;
import com.pz.merchant.domain.EmployeesDivide;
import com.pz.merchant.mapper.CompanyMapper;
import com.pz.merchant.mapper.EmployeesDivideMapper;
import com.pz.merchant.mapper.EmployeesMapper;
import com.pz.merchant.service.ISonOrderService;
import com.pz.system.domain.*;
import com.pz.system.mapper.*;
import com.pz.system.service.impl.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.math.BigDecimal;
import java.util.*;

/**
 * 每天12点新增订单数据
 */
@Slf4j
@EnableScheduling
@Component
@RequiredArgsConstructor
public class InsertTestOrderTask {
    private final BusinessMapper businessMapper;

    private final TotalOrderMapper totalOrderMapper;

    private final YypzOrderMapper yypzOrderMapper;

    private final DbghOrderMapper dbghOrderMapper;

    private final DbwzOrderMapper dbwzOrderMapper;

    private final ZyphOrderMapper zyphOrderMapper;

    private final ZqghOrderMapper zqghOrderMapper;

    private final DbmyOrderMapper dbmyOrderMapper;

    private final StoreOrderMapper storeOrderMapper;

    private final ServicesMapper servicesMapper;

    private final CompanyMapper companyMapper;

    private final EmployeesMapper employeesMapper;

    private final HospitalMapper hospitalMapper;

    private final UserVsitorMapper userVsitorMapper;

    private final EmployeesDivideMapper employeesDivideMapper;

    public static List<Integer> businessIds = Arrays.asList(0, 1, 2, 3, 4, 5, 6);

    @Scheduled(cron = "0 0 0 * * ?") // 每5秒执行一次
    public void insertOrder() {
        //每日单量
        Integer num = RandomUtil.randomInt(30, 50);

        //就诊人员
        List<UserVsitor> userVsitors = userVsitorMapper.selectList(null);

        UserVsitor randomElement = getRandomElement(userVsitors);
        for (int i = 0; i <= num; i++) {
            //遍历固定机构
            List<Company> companies = companyMapper.selectList(Wrappers.<Company>lambdaQuery().in(Company::getId, 5, 14, 15, 16, 17));
            for (Company company : companies) {
                //获取机构下的陪诊员
                Employees employees = employeesMapper.selectOne(Wrappers.<Employees>lambdaQuery().eq(Employees::getCompanyId, company.getId()).last("limit 1"));
                //随机获取陪诊员所在城市的随机医院
                List<Hospital> hospitals = hospitalMapper.selectList(Wrappers.<Hospital>lambdaQuery().eq(Hospital::getCityId, employees.getCityId()).last("limit 10"));
                //随机获取城市中某个医院
                Hospital hospital = getRandomElement(hospitals);
                //遍历所有业务
                for (Integer businessId : businessIds) {
                    //主订单编号
                    Long orderId = saveTotalOrder(businessId, employees.getId(), employees.getCityId().intValue(), company.getId());
                    switch (businessId) {
                        //商城订单
                        case 0:
                            StoreOrder storeOrder = new StoreOrder();
                            storeOrder.setOrderId(orderId.intValue());
                            Integer storeId = RandomUtil.randomInt(1, 5);
                            storeOrder.setGoodsId(storeId);
                            //随机地址id
                            Integer addressId = RandomUtil.randomInt(1, 9);
                            storeOrder.setAddressId(addressId);
                            storeOrder.setStatus(2);
                            storeOrder.setLogistics("顺丰速运");
                            storeOrder.setLogisticsCode("SF" + RandomUtil.randomNumbers(16));
                            storeOrderMapper.insert(storeOrder);
                            break;
                        //预约陪诊
                        case 1:
                            YypzOrder yypzOrder = new YypzOrder();
                            yypzOrder.setOrderId(orderId.intValue());
                            yypzOrder.setPhone(generateRandomPhoneNumber());
                            yypzOrder.setStatus(2);
                            yypzOrder.setVisitTime(new Date());
                            yypzOrder.setHid(hospital.getId());
                            yypzOrder.setVisitor(randomElement.getId());
                            yypzOrderMapper.insert(yypzOrder);
                            break;
                        //代办挂号
                        case 2:
                            DbghOrder dbghOrder = new DbghOrder();
                            dbghOrder.setOrderId(orderId.intValue());
                            dbghOrder.setHid(hospital.getId());
                            dbghOrder.setStatus(2);
                            dbghOrder.setVisitTime(new Date());
                            dbghOrder.setVisitor(randomElement.getId());
                            dbghOrderMapper.insert(dbghOrder);
                            break;
                        //代办问诊
                        case 3:
                            DbwzOrder dbwzOrder = new DbwzOrder();
                            dbwzOrder.setOrderId(orderId.intValue());
                            dbwzOrder.setStatus(2);
                            dbwzOrder.setVisitTime(new Date());
                            dbwzOrder.setChiefComplaint("电话沟通");
                            dbwzOrder.setHistoryOfPresentIllness("电话沟通");
                            dbwzOrder.setLastMedicalTreatmentSituation("电话沟通");
                            dbwzOrder.setPastHistory("电话沟通");
                            dbwzOrder.setPostTreatmentCondition("电话沟通");
                            dbwzOrder.setRelatedReports("电话沟通");
                            dbwzOrder.setServiceRequirements("电话沟通");
                            dbwzOrder.setVisitor(randomElement.getId());
                            dbwzOrderMapper.insert(dbwzOrder);
                            break;
                        //住院陪护
                        case 4:
                            ZyphOrder zyphOrder = new ZyphOrder();
                            zyphOrder.setOrderId(orderId.intValue());
                            zyphOrder.setHid(hospital.getId());
                            zyphOrder.setStatus(2);
                            zyphOrder.setVisitor(randomElement.getId());
                            zyphOrder.setOverTime(new Date());
                            zyphOrderMapper.insert(zyphOrder);
                            break;
                        //代办买药
                        case 5:
                            DbmyOrder dbmyOrder = new DbmyOrder();
                            dbmyOrder.setOrderId(orderId.intValue());
                            dbmyOrder.setPhone(generateRandomPhoneNumber());
                            dbmyOrder.setAddress("***");
                            dbmyOrder.setAddressInfo("***");
                            dbmyOrder.setPzShr(employees.getName());
                            dbmyOrder.setPzShPhone(employees.getPhone());
                            dbmyOrderMapper.insert(dbmyOrder);
                            break;
                        //诊前挂号
                        case 6:
                            ZqghOrder zqghOrder = new ZqghOrder();
                            zqghOrder.setOrderId(orderId.intValue());
                            zqghOrder.setHid(hospital.getId());
                            zqghOrder.setStatus(2);
                            zqghOrder.setOverTime(new Date());
                            zqghOrder.setDoctorId(1);
                            zqghOrderMapper.insert(zqghOrder);
                            break;
                        default:
                    }
                }
            }
        }
    }

    public Long saveTotalOrder(Integer businessId, Integer emId, Integer cityId, Integer companyId) {
        //随机服务id
        Integer serviceId = RandomUtil.randomInt(1, 12);
        //随机评价
        Integer i = RandomUtil.randomInt(0, 1);
        //获取服务价格
        Services services = servicesMapper.selectById(serviceId);
        //创建主订单
        TotalOrder totalOrder = new TotalOrder();
        totalOrder.setStatus(2);
        totalOrder.setSuborderStatus(2);
        totalOrder.setPayMoney(services.getPrice().doubleValue());
        totalOrder.setIsSatisfaction(i);
        totalOrder.setBusinessId(businessId);
        totalOrder.setFinishTime(new Date());
        totalOrder.setServiceId(serviceId);
        totalOrder.setCityId(cityId);
        totalOrder.setOrderSn(RandomUtil.randomNumbers(21));
        totalOrder.setEmId(emId);
        totalOrderMapper.insert(totalOrder);

        //添加机构收益
        EmployeesDivide employeesDivide = new EmployeesDivide();
        employeesDivide.setOrderId(totalOrder.getId().intValue());
        employeesDivide.setOrderPrice(totalOrder.getPayMoney() + "");
        double money = 0;
        if (services.getFenmo() == 0) {
            money = totalOrder.getPayMoney();
        } else if (services.getFenmo() != 0) {
            double fenmo = (double) services.getFenmo() / 100;
            double v = totalOrder.getPayMoney() * fenmo;
            money = totalOrder.getPayMoney() - v;
        }

        Company company = companyMapper.selectById(companyId);
        company.setTotalRevenue((Double.parseDouble(company.getTotalRevenue()) + money) + "");
        company.setBalance((Double.parseDouble(company.getBalance()) + money) + "");
        employeesDivide.setCompanyId(companyId);
        companyMapper.updateById(company);
        employeesDivide.setDividePrice(money + "");
        employeesDivideMapper.insert(employeesDivide);
        return totalOrder.getId();
    }

    public static String generateRandomPhoneNumber() {
        StringBuilder sb = new StringBuilder();
        Random random = new Random();
        // 手机号码前三位
        String[] prefixArray = {"130", "131", "132", "133", "134", "135", "136",
            "137", "138", "139", "150", "151", "152", "153", "155", "156",
            "157", "158", "159", "180", "181", "182", "183", "185", "186",
            "187", "188", "189"};
        String prefix = prefixArray[random.nextInt(prefixArray.length)];
        sb.append(prefix);
        // 手机号码后八位
        for (int i = 0; i < 8; i++) {
            sb.append(random.nextInt(10));
        }
        return sb.toString();
    }

    public static <T> T getRandomElement(List<T> list) {
        Random random = new Random();
        int index = random.nextInt(list.size());
        return list.get(index);
    }

    public static void main(String[] args) {

    }
}