package com.pz.web.task;

import cn.hutool.core.util.RandomUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.pz.common.utils.DateUtils;
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 org.springframework.transaction.annotation.Transactional;

import javax.annotation.PostConstruct;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
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;

    private final FalseDataMapper falseDataMapper;

    private final DepartmentMapper departmentMapper;

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

    public static Map<Integer, Integer> orderNumMap = new HashMap<>();

    static {
//        //上海
//        orderNumMap.put(5, 53);
        //北京
        orderNumMap.put(15, 50);
//        //杭州
//        orderNumMap.put(14, 48);
        //合肥
        orderNumMap.put(17, 32);
//        //长沙
//        orderNumMap.put(18, 38);
        //贵阳
        orderNumMap.put(19, 25);
        //西安
        orderNumMap.put(16, 27);
    }

    @Scheduled(cron = "0 0 1 * * ?") // 凌晨12点执行
    @Transactional
    public void insertUser() {

        Random random = new Random();
        // 生成 30 到 50 的随机整数
        int randomNumber = random.nextInt(20) + 30;
        List<FalseData> falseData1 = falseDataMapper.selectList();
        FalseData falseData = new FalseData();
        falseData.setId(1L);
        falseData.setAdminToday((long) randomNumber);
        falseData.setAdminSeven(falseData1.get(0).getAdminSeven() + randomNumber);
        falseData.setAdminThirty(falseData1.get(0).getAdminThirty() + randomNumber);
        falseData.setAdminSum(falseData1.get(0).getAdminSum() + randomNumber);
//        falseData.setCompanyToday((long) randomNumber);
//        falseData.setCompanySeven(falseData1.get(0).getCompanySeven() + randomNumber);
//        falseData.setCompanyThirty(falseData1.get(0).getCompanyThirty() + randomNumber);
//        falseData.setCompanySum(falseData1.get(0).getCompanySum() + randomNumber);
        falseDataMapper.updateById(falseData);


//        List<Company> companies = companyMapper.selectList();
//        for (Company company : companies) {
//            FalseData falseData2 = falseDataMapper.selectOne(new LambdaQueryWrapper<FalseData>().eq(FalseData::getCompanyId, company.getId()));
//            if (null == falseData2) {
//                continue;
//            }
//            falseData2.setId(1L);
//            falseData2.setAdminToday((long) randomNumber);
//            falseData2.setAdminSeven(falseData2.getCompanySeven() + randomNumber1);
//            falseData2.setAdminThirty(falseData2.getAdminThirty() + randomNumber1);
//            falseData2.setAdminSum(falseData2.getAdminSum() + randomNumber1);
//            falseDataMapper.updateById(falseData2);
//        }
    }

    @Scheduled(cron = "0 0 0 * * ?") // 凌晨12点执行
    @Transactional
    public void insertOrder() throws InterruptedException {
        // 就诊人员
        List<UserVsitor> userVsitors = userVsitorMapper.selectList(Wrappers.<UserVsitor>lambdaQuery().orderByDesc(UserVsitor::getId).last("limit 50"));
        // 查询固定机构
        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(() -> {
                // 每日单量
                Integer num = orderNumMap.get(company.getId());
                for (int i = 0; i <= num; i++) {
                    //接单人员
                    UserVsitor vsitor = getRandomElement(userVsitors);
                    //随机业务
                    Integer businessId = getRandomElement(businessIds);
                    //获取服务价格
                    List<Services> services = servicesMapper.selectList(Wrappers.<Services>lambdaQuery().eq(Services::getBid, businessId).eq(Services::getCityId, company.getCityId()));
                    //随机服务
                    Services service = getRandomElement(services);


                    Long orderId = saveTotalOrder(businessId, element.getId(), company.getCityId().intValue(), company.getId(), service);
                    List<Hospital> hospitals = hospitalMapper.selectList(Wrappers.<Hospital>lambdaQuery().eq(Hospital::getCityId, company.getCityId()).last("limit 50"));
                    //随机医院
                    Hospital hospital = getRandomElement(hospitals);
                    //随机科室
                    List<Department> departments = departmentMapper.selectList();
                    Department randomElement = getRandomElement(departments);
                    //新增业务
                    randomOrder(businessId, orderId.intValue(), 2, hospital.getId(), vsitor.getId(), element, randomElement.getTitle());
                }
            });
        }
        executorService.shutdown();
        executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
    }

    public void randomOrder(Integer businessId, Integer orderId, Integer status, Integer hid, Integer vid, Employees element, String title) {
        Date dateStr = randomTime();
        Date date = subtractMinutes(dateStr, 31);
        switch (businessId) {
            case 0:
                StoreOrder storeOrder = new StoreOrder();
                storeOrder.setOrderId(orderId);
                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));
                storeOrder.setCreateTime(date);
                storeOrderMapper.insert(storeOrder);
                break;
            case 1:
                YypzOrder yypzOrder = new YypzOrder();
                yypzOrder.setOrderId(orderId.intValue());
                yypzOrder.setPhone(generateRandomPhoneNumber());
                yypzOrder.setStatus(status);
                yypzOrder.setVisitTime(dateStr);
                yypzOrder.setHid(hid);
                yypzOrder.setDidName(title);
                yypzOrder.setVisitor(vid);
                yypzOrder.setCreateTime(date);
                yypzOrderMapper.insert(yypzOrder);
                break;
            case 2:
                DbghOrder dbghOrder = new DbghOrder();
                dbghOrder.setOrderId(orderId.intValue());
                dbghOrder.setHid(hid);
                dbghOrder.setStatus(status);
                dbghOrder.setVisitTime(dateStr);
                dbghOrder.setVisitor(vid);
                dbghOrder.setCreateTime(date);
                dbghOrder.setDidName(title);
                dbghOrderMapper.insert(dbghOrder);
                break;
            case 3:
                DbwzOrder dbwzOrder = new DbwzOrder();
                dbwzOrder.setOrderId(orderId.intValue());
                dbwzOrder.setStatus(status);
                dbwzOrder.setVisitTime(dateStr);
                dbwzOrder.setChiefComplaint("电话沟通");
                dbwzOrder.setHistoryOfPresentIllness("电话沟通");
                dbwzOrder.setLastMedicalTreatmentSituation("电话沟通");
                dbwzOrder.setPastHistory("电话沟通");
                dbwzOrder.setPostTreatmentCondition("电话沟通");
                dbwzOrder.setRelatedReports("电话沟通");
                dbwzOrder.setServiceRequirements("电话沟通");
                dbwzOrder.setDidName("电话沟通");
                dbwzOrder.setVisitor(vid);
                dbwzOrder.setCreateTime(date);
                dbwzOrderMapper.insert(dbwzOrder);
                break;
            case 4:
                ZyphOrder zyphOrder = new ZyphOrder();
                zyphOrder.setOrderId(orderId.intValue());
                zyphOrder.setHid(hid);
                zyphOrder.setStatus(status);
                zyphOrder.setVisitor(vid);
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
                String formattedDate = sdf.format(date);
                String format = sdf.format(dateStr);
                zyphOrder.setStartDay(formattedDate);
                zyphOrder.setEndDay(format);
                zyphOrder.setOverTime(dateStr);
                zyphOrder.setDidName(title);
                zyphOrder.setCreateTime(date);
                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());
                dbmyOrder.setCreateTime(date);
                dbmyOrder.setIsRefrigerate(RandomUtil.randomInt(0, 2));
                dbmyOrderMapper.insert(dbmyOrder);
                break;
            case 6:
                ZqghOrder zqghOrder = new ZqghOrder();
                zqghOrder.setOrderId(orderId.intValue());
                zqghOrder.setHid(hid);
                zqghOrder.setStatus(status);
                zqghOrder.setOverTime(dateStr);
                zqghOrder.setDidName(title);
                zqghOrder.setDoctorId(1);
                zqghOrder.setCreateTime(date);
                zqghOrderMapper.insert(zqghOrder);
                break;
            default:
                break;
        }
    }


    public Date randomTime() {
        Calendar calendar = new GregorianCalendar();
        calendar.set(Calendar.HOUR_OF_DAY, 9); // 设置开始时间为早上9点
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        long startMillis = calendar.getTimeInMillis(); // 获取开始时间的毫秒数

        calendar.set(Calendar.HOUR_OF_DAY, 18); // 设置结束时间为晚上6点
        long endMillis = calendar.getTimeInMillis(); // 获取结束时间的毫秒数

        long randomMillis = startMillis + (long) (Math.random() * (endMillis - startMillis)); // 生成随机的时间毫秒数

        Date randomDate = new Date(randomMillis); // 转换为Date类型

        return randomDate;
    }

    public Date subtractMinutes(Date date, int minutes) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MINUTE, -minutes);
        return calendar.getTime();
    }

    public Long saveTotalOrder(Integer businessId, Integer emId, Integer cityId, Integer companyId, Services services) {
        //创建主订单
        TotalOrder totalOrder = new TotalOrder();
//        Integer status = RandomUtil.randomInt(0, 3);
        totalOrder.setStatus(2);
//        Integer suborderStatus = RandomUtil.randomInt(0, 3);
        totalOrder.setSuborderStatus(2);
        totalOrder.setPayMoney(services.getPrice().doubleValue());
        totalOrder.setIsSatisfaction(1);
        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;
        double fenmo = (double) 20 / 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) {
        if (CollectionUtils.isEmpty(list)) {
            return null;
        }
        Random random = new Random();
        int index = random.nextInt(list.size());
        return list.get(index);
    }

    public static void main(String[] args) {

    }
}