package com.ruoyi.project.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.annotation.DataSource;
import com.ruoyi.common.enums.DataSourceType;
import com.ruoyi.project.domain.Wcmmetatablegovdocnews;
import com.ruoyi.project.mapper.WcmmetatablegovdocnewsMapper;
import com.ruoyi.project.mapper.secondary.SecondaryWcmmetatablegovdocnewsMapper;

import com.ruoyi.project.service.WcmmetatablegovdocnewsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
public class WcmmetatablegovdocnewsServiceImpl implements WcmmetatablegovdocnewsService {

    @Autowired
    private WcmmetatablegovdocnewsMapper wcmmetatablegovdocnewsMapper;

    @Autowired
    private SecondaryWcmmetatablegovdocnewsMapper secondaryWcmmetatablegovdocnewsMapper;

    @DataSource(value = DataSourceType.SLAVE)
    public List<Wcmmetatablegovdocnews> getDataFromSourceDB() {
        // 计算10分钟前的时间
        Date tenMinutesAgo = getTenMinutesAgo();
        System.out.println("查询最近10分钟内的数据，时间条件：opertime >= " + tenMinutesAgo);
        List<String> siteids = new ArrayList<>();
        //siteids.add("95");
        // 使用SQL查询最近10分钟内的数据
        // 方式1：基础查询
        List<Wcmmetatablegovdocnews> dataList = secondaryWcmmetatablegovdocnewsMapper.selectRecentDataBySiteids(tenMinutesAgo, siteids);

        return dataList;
    }

    @Transactional(transactionManager = "transactionManagerPrimary")
    public void syncDataToTargetDB(List<Wcmmetatablegovdocnews> dataList) {
        if (dataList == null || dataList.isEmpty()) {
            System.out.println("没有数据需要同步");
            return;
        }

        try {
            // 使用Mybatis Plus的saveOrUpdateBatch方法
            // 注意：这里保持原始的opertime，不覆盖为当前时间
            boolean result = batchSaveOrUpdate(dataList);

            if (result) {
                System.out.println("数据同步成功：共处理 " + dataList.size() + " 条最近10分钟内的数据");

                // 打印处理的数据时间范围
                if (!dataList.isEmpty()) {
                    Date minTime = dataList.stream()
                            .map(Wcmmetatablegovdocnews::getTime)
                            .min(Date::compareTo)
                            .orElse(null);
                    Date maxTime = dataList.stream()
                            .map(Wcmmetatablegovdocnews::getTime)
                            .max(Date::compareTo)
                            .orElse(null);
                    System.out.println("处理数据时间范围：" + minTime + " 到 " + maxTime);
                }
            } else {
                System.err.println("数据同步失败");
            }

        } catch (Exception e) {
            System.err.println("批量数据同步异常：" + e.getMessage());
        }
    }



    public void executeDataSync() {
        try {
            System.out.println("=== 开始执行数据同步任务 ===");
            System.out.println("执行时间：" + new Date());

            // 1. 查询最近10分钟内的数据
            List<Wcmmetatablegovdocnews> dataList = getDataFromSourceDB();
            System.out.println("查询到最近10分钟内的数据：" + dataList.size() + " 条");

            // 2. 同步数据
            if (!dataList.isEmpty()) {
                syncDataToTargetDB(dataList);
            } else {
                System.out.println("没有需要同步的数据");
            }

            System.out.println("=== 数据同步任务完成 ===");
            System.out.println("完成时间：" + new Date());

        } catch (Exception e) {
            System.err.println("数据同步任务执行失败：" + e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 手动实现批量保存或更新
     */
    private boolean batchSaveOrUpdate(List<Wcmmetatablegovdocnews> dataList) {
        try {
            for (Wcmmetatablegovdocnews data : dataList) {
                // 根据主键查询是否存在
                // 根据docid查询
                // 获取docid
                Long docid = data.getDocid();
                Wcmmetatablegovdocnews existing = wcmmetatablegovdocnewsMapper.selectById(data.getDocid());
                if (existing != null) {
                    // 存在则更新
                    wcmmetatablegovdocnewsMapper.updateById(data);
                } else {
                    // 不存在则插入
                    wcmmetatablegovdocnewsMapper.insert(data);
                }
            }
            return true;
        } catch (Exception e) {
            System.err.println("批量保存失败：" + e.getMessage());
            throw e;
        }
    }

    /**
     * 获取10分钟前的时间
     */
    private Date getTenMinutesAgo() {
        return new Date(System.currentTimeMillis() - 10 * 60 * 1000);
    }

    private Date getTenMinutesAgo1() {
        // 注意：这种方法不精确，因为月份天数不同
        // 假设平均一个月30天
        long thirtyDaysInMillis = 30L * 24 * 60 * 60 * 1000;
        return new Date(System.currentTimeMillis() - thirtyDaysInMillis);
    }
//    private Date getTenMinutesAgo() {
//        LocalDate tenYearsAgo = LocalDate.now().minusYears(10);
//        return Date.from(tenYearsAgo.atStartOfDay(ZoneId.systemDefault()).toInstant());
//    }
}