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.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * 每天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 * * ?") // 凌晨12点执行
    public void insertOrder() throws InterruptedException {
        // 就诊人员
        List<UserVsitor> userVsitors = userVsitorMapper.selectList(Wrappers.<UserVsitor>lambdaQuery().last("limit 20"));
        // 查询固定机构
        List<Company> companies = companyMapper.selectList(Wrappers.<Company>lambdaQuery().in(Company::getId, 5, 14, 15, 16, 17, 18, 19));
        // 加入线程池并发执行
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        for (Company company : companies) {
            List<Employees> employees = employeesMapper.selectList(Wrappers.<Employees>lambdaQuery().eq(Employees::getCompanyId, company.getId()).last("limit 10"));
            Employees element = getRandomElement(employees);

            executorService.submit(() -> {
                for (Integer businessId : businessIds) {
                    //获取服务价格
                    List<Services> services = servicesMapper.selectList(Wrappers.<Services>lambdaQuery().eq(Services::getBid, businessId).eq(Services::getCityId, company.getCityId()));
                    // 每日单量
                    Integer num = RandomUtil.randomInt(4, 10);
                    for (int i = 0; i <= num; i++) {
                        //接单人员
                        UserVsitor randomElement = getRandomElement(userVsitors);
                        for (Services service : services) {
                            Long orderId = saveTotalOrder(businessId, element.getId(), company.getCityId().intValue(), company.getId(), service);
                            Integer status = RandomUtil.randomInt(0, 2);

                            List<Hospital> hospitals = hospitalMapper.selectList(Wrappers.<Hospital>lambdaQuery().eq(Hospital::getCityId, company.getCityId()).last("limit 50"));
                            Hospital hospital = getRandomElement(hospitals);
                            switch (businessId) {
                                case 0:
                                    StoreOrder storeOrder = new StoreOrder();
                                    storeOrder.setOrderId(orderId.intValue());
                                    Integer storeId = RandomUtil.randomInt(1, 5);
                                    storeOrder.setGoodsId(storeId);
                                    Integer addressId = RandomUtil.randomInt(1, 9);
                                    storeOrder.setAddressId(addressId);
                                    storeOrder.setStatus(status);
                                    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(status);
                                    yypzOrder.setVisitTime(randomTime());
                                    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(status);
                                    dbghOrder.setVisitTime(randomTime());
                                    dbghOrder.setVisitor(randomElement.getId());
                                    dbghOrderMapper.insert(dbghOrder);
                                    break;
                                case 3:
                                    DbwzOrder dbwzOrder = new DbwzOrder();
                                    dbwzOrder.setOrderId(orderId.intValue());
                                    dbwzOrder.setStatus(status);
                                    dbwzOrder.setVisitTime(randomTime());
                                    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(status);
                                    zyphOrder.setVisitor(randomElement.getId());
                                    zyphOrder.setOverTime(randomTime());
                                    zyphOrderMapper.insert(zyphOrder);
                                    break;
                                case 5:
                                    DbmyOrder dbmyOrder = new DbmyOrder();
                                    dbmyOrder.setOrderId(orderId.intValue());
                                    dbmyOrder.setPhone(generateRandomPhoneNumber());
                                    dbmyOrder.setAddress("***");
                                    dbmyOrder.setAddressInfo("***");
                                    dbmyOrder.setPzShr(element.getName());
                                    dbmyOrder.setPzShPhone(element.getPhone());
                                    dbmyOrderMapper.insert(dbmyOrder);
                                    break;
                                case 6:
                                    ZqghOrder zqghOrder = new ZqghOrder();
                                    zqghOrder.setOrderId(orderId.intValue());
                                    zqghOrder.setHid(hospital.getId());
                                    zqghOrder.setStatus(status);
                                    zqghOrder.setOverTime(randomTime());
                                    zqghOrder.setDoctorId(1);
                                    zqghOrderMapper.insert(zqghOrder);
                                    break;
                                default:
                                    break;
                            }
                        }
                    }
                }
            });
        }
        executorService.shutdown();
        executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
    }

    public Date randomTime() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 9);  // 设置小时为9点
        calendar.set(Calendar.MINUTE, 0);       // 设置分钟为0分
        calendar.set(Calendar.SECOND, 0);       // 设置秒钟为0秒

        long startTimeInMillis = calendar.getTimeInMillis();  // 获取当天9点的时间戳

        // 计算10点与9点之间的毫秒数范围
        long range = 60 * 60 * 1000;  // 1小时的毫秒数
        long randomOffset = (long) (Math.random() * range);  // 在范围内生成随机偏移量

        // 计算随机时间的时间戳
        long randomTimeInMillis = startTimeInMillis + randomOffset;

        // 将时间戳转换为Date类型
        Date randomTime = new Date(randomTimeInMillis);

        return randomTime;
    }

    public Long saveTotalOrder(Integer businessId, Integer emId, Integer cityId, Integer companyId, Services services) {
        //随机评价
        Integer i = RandomUtil.randomInt(0, 1);
        //创建主订单
        TotalOrder totalOrder = new TotalOrder();
        Random random = new Random();
        Integer status = RandomUtil.randomInt(1, 3);
        totalOrder.setStatus(status);
        Integer suborderStatus = RandomUtil.randomInt(0, 3);
        totalOrder.setSuborderStatus(suborderStatus);
        totalOrder.setPayMoney(services.getPrice().doubleValue());
        totalOrder.setIsSatisfaction(i);
        totalOrder.setBusinessId(businessId);
        totalOrder.setFinishTime(randomTime());
        totalOrder.setServiceId(services.getId());
        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) {

    }
}