/**
 * @ProjectName: 智慧评标-主观分助手
 * @Package: com.zhpb.gdyd_zhpb_zgf.service.impl
 * @ClassName: PromptTemplateServiceImpl
 * @Description: 提示词模板服务实现
 * @Author: 张志锋
 * @Date: 2025-11-03
 * @Version: 1.0
 * @Copyright: © 2025 智慧评标-主观分助手
 */
package com.zhpb.gdyd_zhpb_zgf.service.impl;

import com.zhpb.gdyd_zhpb_zgf.dto.PromptTemplateDto;
import com.zhpb.gdyd_zhpb_zgf.entity.mysql.PromptTemplate;
import com.zhpb.gdyd_zhpb_zgf.repository.mysql.PromptTemplateRepository;
import com.zhpb.gdyd_zhpb_zgf.service.PromptTemplateService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

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

/**
 * 提示词模板服务实现
 */
@Service
public class PromptTemplateServiceImpl implements PromptTemplateService {

    private static final Logger logger = LoggerFactory.getLogger(PromptTemplateServiceImpl.class);

    @Autowired
    private PromptTemplateRepository promptTemplateRepository;

    @Override
    public List<PromptTemplateDto> getAllTemplates(String templateType) {
        List<PromptTemplate> templates;
        if (templateType != null && !templateType.trim().isEmpty()) {
            templates = promptTemplateRepository.findAllByTemplateType(templateType);
        } else {
            templates = promptTemplateRepository.findAll();
        }

        return templates.stream()
                .map(this::convertToDto)
                .collect(Collectors.toList());
    }

    @Override
    public PromptTemplateDto getTemplateById(String templateId) {
        PromptTemplate template = promptTemplateRepository.findByTemplateId(templateId);
        return template != null ? convertToDto(template) : null;
    }

    @Override
    @Transactional
    public PromptTemplateDto createTemplate(PromptTemplateDto dto, String userId) {
        // 检查模板名称是否已存在
        if (promptTemplateRepository.findByTemplateName(dto.getTemplateName()) != null) {
            throw new IllegalArgumentException("模板名称已存在: " + dto.getTemplateName());
        }

        PromptTemplate template = new PromptTemplate();
        template.setTemplateName(dto.getTemplateName());
        template.setTemplateType(dto.getTemplateType() != null ? dto.getTemplateType() : "qa");
        template.setPromptContent(dto.getPromptContent());
        template.setDescription(dto.getDescription());
        template.setIsActive(dto.getIsActive() != null ? dto.getIsActive() : true);
        template.setSortOrder(dto.getSortOrder() != null ? dto.getSortOrder() : 0);
        template.setCreatedBy(userId);
        template.setUpdatedBy(userId);

        template = promptTemplateRepository.save(template);

        logger.info("创建提示词模板: {} (ID: {})", template.getTemplateName(), template.getTemplateId());
        return convertToDto(template);
    }

    @Override
    @Transactional
    public PromptTemplateDto updateTemplate(String templateId, PromptTemplateDto dto, String userId) {
        PromptTemplate template = promptTemplateRepository.findByTemplateId(templateId);
        if (template == null) {
            throw new IllegalArgumentException("模板不存在: " + templateId);
        }

        // 检查模板名称是否已被其他模板使用
        PromptTemplate existingTemplate = promptTemplateRepository.findByTemplateName(dto.getTemplateName());
        if (existingTemplate != null && !existingTemplate.getTemplateId().equals(templateId)) {
            throw new IllegalArgumentException("模板名称已存在: " + dto.getTemplateName());
        }

        template.setTemplateName(dto.getTemplateName());
        template.setTemplateType(dto.getTemplateType());
        template.setPromptContent(dto.getPromptContent());
        template.setDescription(dto.getDescription());
        template.setIsActive(dto.getIsActive());
        template.setSortOrder(dto.getSortOrder());
        template.setUpdatedBy(userId);

        template = promptTemplateRepository.save(template);

        logger.info("更新提示词模板: {} (ID: {})", template.getTemplateName(), template.getTemplateId());
        return convertToDto(template);
    }

    @Override
    @Transactional
    public void deleteTemplate(String templateId) {
        PromptTemplate template = promptTemplateRepository.findByTemplateId(templateId);
        if (template == null) {
            throw new IllegalArgumentException("模板不存在: " + templateId);
        }

        promptTemplateRepository.delete(template);
        logger.info("删除提示词模板: {} (ID: {})", template.getTemplateName(), template.getTemplateId());
    }

    @Override
    @Transactional
    public void toggleTemplateStatus(String templateId, Boolean isActive, String userId) {
        PromptTemplate template = promptTemplateRepository.findByTemplateId(templateId);
        if (template == null) {
            throw new IllegalArgumentException("模板不存在: " + templateId);
        }

        template.setIsActive(isActive);
        template.setUpdatedBy(userId);

        promptTemplateRepository.save(template);

        logger.info("修改提示词模板状态: {} (ID: {}, 状态: {})",
                template.getTemplateName(), template.getTemplateId(), isActive ? "启用" : "禁用");
    }

    @Override
    public PromptTemplate getActiveTemplate(String templateType) {
        List<PromptTemplate> templates = promptTemplateRepository.findActiveByTemplateType(templateType);
        return templates.isEmpty() ? null : templates.get(0);
    }

    /**
     * 将实体转换为DTO
     */
    private PromptTemplateDto convertToDto(PromptTemplate template) {
        PromptTemplateDto dto = new PromptTemplateDto();
        dto.setTemplateId(template.getTemplateId());
        dto.setTemplateName(template.getTemplateName());
        dto.setTemplateType(template.getTemplateType());
        dto.setPromptContent(template.getPromptContent());
        dto.setDescription(template.getDescription());
        dto.setIsActive(template.getIsActive());
        dto.setSortOrder(template.getSortOrder());
        dto.setCreatedBy(template.getCreatedBy());
        dto.setUpdatedBy(template.getUpdatedBy());
        dto.setCreateTime(template.getCreateTime());
        dto.setUpdateTime(template.getUpdateTime());
        return dto;
    }
}
