package com.test.bijihoudaun.service.impl;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.test.bijihoudaun.entity.ImageName;
import com.test.bijihoudaun.mapper.ImageNameMapper;
import jakarta.annotation.Resource;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 图片名称同步服务
 * 处理 Markdown 内容中的图片名称同步，独立的事务和异步处理
 */
@Service
public class ImageNameSyncService {

    @Resource
    private ImageNameMapper imageNameMapper;

    /**
     * 同步图片名称
     * 异步执行，独立事务
     */
    @Async("imageNameSyncExecutor")
    @Transactional
    public void syncImageNames(Long markdownId, List<String> strings) {
        // 查询数据库中已存在的文件名
        List<ImageName> imageNames = imageNameMapper.selectList(new LambdaUpdateWrapper<ImageName>()
                .eq(ImageName::getMarkdownId, markdownId));
        
        // 若是数据库中的数据为null，则插入
        if (CollUtil.isEmpty(imageNames)) {
            if (CollUtil.isNotEmpty(strings)) {
                List<ImageName> list = strings.stream().map(fileName -> {
                    ImageName imageName = new ImageName();
                    imageName.setFileName(fileName);
                    imageName.setMarkdownId(markdownId);
                    return imageName;
                }).toList();
                // 批量插入新的文件名（使用MyBatis Plus批量插入）
                imageNameMapper.insert(list);
            }
        } else {
            // 数据库中已有记录，需要对比处理
            // 获取数据库中的文件名列表
            List<String> dbFileNames = imageNames.stream()
                    .map(ImageName::getFileName)
                    .toList();

            // 找出需要新增的文件名（在strings中但不在数据库中）
            List<String> toInsert = strings.stream()
                    .filter(fileName -> !dbFileNames.contains(fileName))
                    .toList();

            // 找出需要删除的记录（在数据库中但不在strings中）
            List<ImageName> toDelete = imageNames.stream()
                    .filter(imageName -> !strings.contains(imageName.getFileName()))
                    .toList();

            // 插入新增的文件名
            if (CollUtil.isNotEmpty(toInsert)) {
                List<ImageName> insertList = toInsert.stream().map(fileName -> {
                    ImageName imageName = new ImageName();
                    imageName.setFileName(fileName);
                    imageName.setMarkdownId(markdownId);
                    return imageName;
                }).toList();

                imageNameMapper.insert(insertList);
            }

            // 删除不再需要的记录
            if (CollUtil.isNotEmpty(toDelete)) {
                List<Long> deleteIds = toDelete.stream()
                        .map(ImageName::getId)
                        .toList();
                imageNameMapper.deleteByIds(deleteIds);
            }
        }
    }
}
