package com.backendsys.service.Ai;

import com.backendsys.entity.Ai.Aiivh.AiPersonTimbreCustomDTO;
import com.backendsys.entity.Ai.Aiivh.AiPersonTimbreDTO;
import com.backendsys.mapper.Ai.Aiivh.AiivhTimbreMapper;
import com.backendsys.service.SDKService.SDKTencent.SDKTencentAiTimbreService;
import com.backendsys.utils.ListUtil;
import com.backendsys.utils.MapUtil;
import com.backendsys.utils.response.PageInfoResult;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class AiPersonTimbreServiceImpl implements AiPersonTimbreService {

    @Autowired
    private AiivhTimbreMapper aiivhTimbreMapper;


    @Autowired
    private SDKTencentAiTimbreService sdkTencentAiTimbreService;

    @Override
    public Map<String, Object> queryAiivhPublicTimbreList(Integer pageNum, Integer pageSize, AiPersonTimbreDTO aiPersonTimbreDTO) {
        // 分页查询
        if (pageNum != null && pageSize != null) {
            PageHelper.startPage(pageNum, pageSize);
            PageHelper.getLocalPage().setPageSizeZero(true);
        }
        // 分页输出 (自定义)
        List<Map<String, Object>> list = aiivhTimbreMapper.queryAiivhPublicTimbreList(aiPersonTimbreDTO);

        PageInfoResult pageInfoResult = new PageInfoResult(list);
        return pageInfoResult.toMap();
    }

    @Override
    public Map<String, Object> queryAiivhTimbreList(Integer pageNum, Integer pageSize, AiPersonTimbreCustomDTO aiPersonTimbreCustomDTO) {
        // 分页查询
        if (pageNum != null && pageSize != null) {
            PageHelper.startPage(pageNum, pageSize);
            PageHelper.getLocalPage().setPageSizeZero(true);
        }
        // 分页输出 (自定义)
        List<Map<String, Object>> list = aiivhTimbreMapper.queryAiivhTimbreList(aiPersonTimbreCustomDTO);

        PageInfoResult pageInfoResult = new PageInfoResult(list);
        return pageInfoResult.toMap();
    }


    /**
     * 获得全部音色列表 (循环调用接口，至到获得全部数据)
     * List<Map<String, Object>> timbre_assets = getAllTimbreAssets(pageIndex, pageSize);
     */
    private List<Map<String, Object>> getAllTimbreAssets(Integer pageIndex, Integer pageSize) {

        // 初始化变量
        List<Map<String, Object>> timbre_assets = new ArrayList<>();

        // 第一次调用 initTimbre 方法，并将当前页的数据追加到 timbre_assets 列表中
        Map<String, Object> resp = sdkTencentAiTimbreService.initTimbre(pageIndex, pageSize);
        Integer total = (Integer) MapUtil.get(resp, "Payload.Total");
        timbre_assets.addAll((List<Map<String, Object>>) MapUtil.get(resp, "Payload.TimbreAssets"));

        // 循环获取所有页的数据
        while (total != null && total > 0 && pageIndex * pageSize <= total) {
            // 准备下一次查询，页码加1
            pageIndex++;
            // System.out.println(pageIndex);

            // 再次调用 initTimbre 方法获取下一页的数据，并将当前页的数据追加到 timbre_assets 列表中
            resp = sdkTencentAiTimbreService.initTimbre(pageIndex, pageSize);
            total = (Integer) MapUtil.get(resp, "Payload.Total");
            timbre_assets.addAll((List<Map<String, Object>>) MapUtil.get(resp, "Payload.TimbreAssets"));
            System.out.println(resp);
        }
        return timbre_assets;
    }

    /**
     * 文档中心 > 腾讯云智能数智人 > API 接入 > 个人资产管理 API 文档-v1.0.9 > 分页查询音色列表
     * https://cloud.tencent.com/document/product/1240/99703
     *
     * 将查询到的公共音色存入数据库
     *
     * (有效期：2024/03/25-2024/04/08) 过期后能否继续查询？
     */
    @Override
    public long insertAiivhPublicTimbreBatch(Integer pageIndex, Integer pageSize) {

        // 初始化变量
        List<Map<String, Object>> timbre_assets = getAllTimbreAssets(pageIndex, pageSize);

        // 遍历列表，将 key 由大驼峰改为下划线命名
        timbre_assets = ListUtil.convertToUnderscoreCase(timbre_assets);

        // 遍历列表，将没有 expire_data 的值存入 (没有过期即是公共音色)
        List<Map<String, Object>> filteredTimbreAssets = timbre_assets.stream()
            .filter(map -> map.get("expire_date") == null || ((String) map.get("expire_date")).trim().isEmpty())
            .map(map -> {
                // 遍历列表，将每行记录的 emotional_categories 从 Array 转为 String
                String arrToStringField = "emotional_categories";
                if (map.containsKey(arrToStringField)) {
                    Object fieldVal = map.get(arrToStringField);
                    fieldVal = fieldVal.toString().substring(1, fieldVal.toString().length() - 1).replaceAll("\\s", "");
                    map.put(arrToStringField, fieldVal);
                }
                return map;
            })
            .collect(Collectors.toList());
        // ListUtil.convertToString(filteredTimbreAssets, "emotional_categories");


        System.out.println(filteredTimbreAssets);

        // 清除全部数据
        aiivhTimbreMapper.cleanAiivhPublicTimbre();
        // 重新从远程获取新的形象

        return aiivhTimbreMapper.insertAiivhPublicTimbreBatch(filteredTimbreAssets);
    }

}
