package com.fs.survey.service.impl;

import java.util.List;
import java.util.Objects;

import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.fs.common.config.LoginContextManager;
import com.fs.common.exception.ServiceException;
import com.fs.common.utils.DateUtils;
import com.fs.company.cache.CompanyCacheService;
import com.fs.survey.domain.SurveyQuestionnaire;
import com.fs.survey.domain.SurveyQuestionnaireVersion;
import com.fs.survey.enums.SurveyQuestionnaireTypeEnum;
import com.fs.survey.mapper.SurveyQuestionnaireMapper;
import com.fs.survey.mapper.SurveyQuestionnaireVersionMapper;
import com.fs.survey.service.ISurveyQuestionnaireService;
import com.fs.survey.vo.DoctorLevelApplyQuestionnaireVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 问卷Service业务层处理
 *
 */
@Service
public class SurveyQuestionnaireServiceImpl implements ISurveyQuestionnaireService {
    @Autowired
    private SurveyQuestionnaireMapper surveyQuestionnaireMapper;
    @Autowired
    private SurveyQuestionnaireVersionMapper surveyQuestionnaireVersionMapper;
    /**
     * 查询问卷
     *
     * @param id 问卷主键
     * @return 问卷
     */
    @Override
    public SurveyQuestionnaire selectSurveyQuestionnaireById(Long id) {
        return surveyQuestionnaireMapper.selectSurveyQuestionnaireById(id);
    }

    /**
     * 查询问卷列表
     *
     * @param surveyQuestionnaire 问卷
     * @return 问卷
     */
    @Override
    public List<SurveyQuestionnaire> selectSurveyQuestionnaireList(SurveyQuestionnaire surveyQuestionnaire) {
        List<SurveyQuestionnaire> surveyQuestionnaires = surveyQuestionnaireMapper.selectSurveyQuestionnaireList(surveyQuestionnaire);
        for (SurveyQuestionnaire questionnaire : surveyQuestionnaires) {
            if(ObjectUtils.isNotNull(questionnaire.getCompanyId())){
                questionnaire.setCompanyName(CompanyCacheService.getCompanyNameById(questionnaire.getCompanyId()));
            }
        }
        return surveyQuestionnaires;
    }

    /**
     * 新增问卷
     *
     * @param surveyQuestionnaire 问卷
     * @return 结果
     */
    @Override
    public int insertSurveyQuestionnaire(SurveyQuestionnaire surveyQuestionnaire) {
        SurveyQuestionnaire searchSurveyQuestionnaire = new SurveyQuestionnaire();

        if(surveyQuestionnaire.getSurveyQuestionnaireType().equals(SurveyQuestionnaireTypeEnum.DOCTOR_GRADE_APPLICATION.getCode())){
            searchSurveyQuestionnaire.setSurveyQuestionnaireType(SurveyQuestionnaireTypeEnum.DOCTOR_GRADE_APPLICATION.getCode());
            searchSurveyQuestionnaire.setCompanyId(surveyQuestionnaire.getCompanyId());
            List<SurveyQuestionnaire> surveyQuestionnaires = surveyQuestionnaireMapper.selectSurveyQuestionnaireList(searchSurveyQuestionnaire);
            if (surveyQuestionnaires != null && !surveyQuestionnaires.isEmpty()) {
                throw new ServiceException("已有医生定级申请模板请勿重复创建");
            }
        }

        if(Objects.isNull(surveyQuestionnaire.getCompanyId())){
            throw new ServiceException("非法参数");

        }


        surveyQuestionnaire.setCreateTime(DateUtils.getNowDate());
        surveyQuestionnaire.setCompanyId(surveyQuestionnaire.getCompanyId());

        return surveyQuestionnaireMapper.insertSurveyQuestionnaire(surveyQuestionnaire);
    }

    /**
     * 修改问卷
     *
     * @param surveyQuestionnaire 问卷
     * @return 结果
     */
    @Override
    public int updateSurveyQuestionnaire(SurveyQuestionnaire surveyQuestionnaire) {
        surveyQuestionnaire.setUpdateTime(DateUtils.getNowDate());
        return surveyQuestionnaireMapper.updateSurveyQuestionnaire(surveyQuestionnaire);
    }

    /**
     * 批量删除问卷
     *
     * @param ids 需要删除的问卷主键
     * @return 结果
     */
    @Override
    public int deleteSurveyQuestionnaireByIds(Long[] ids) {
        return surveyQuestionnaireMapper.deleteSurveyQuestionnaireByIds(ids);
    }

    /**
     * 删除问卷信息
     *
     * @param id 问卷主键
     * @return 结果
     */
    @Override
    public int deleteSurveyQuestionnaireById(Long id) {
        return surveyQuestionnaireMapper.deleteSurveyQuestionnaireById(id);
    }

    /**
     * 发布问卷
     *
     * @param id 问卷ID
     * @param versionId 版本ID
     * @return 结果
     */
    @Override
    public int publishQuestionnaire(Long id, Long versionId) {
        SurveyQuestionnaire questionnaire = new SurveyQuestionnaire();
        questionnaire.setId(id);
        questionnaire.setStatus(1); // 已发布
        questionnaire.setCurrentVersionId(versionId);
        return surveyQuestionnaireMapper.updateSurveyQuestionnaire(questionnaire);
    }

    /**
     * 停用问卷
     *
     * @param id 问卷ID
     * @return 结果
     */
    @Override
    public int disableQuestionnaire(Long id) {
        SurveyQuestionnaire questionnaire = new SurveyQuestionnaire();
        questionnaire.setId(id);
        questionnaire.setStatus(2); // 已停用
        return surveyQuestionnaireMapper.updateSurveyQuestionnaire(questionnaire);
    }

    @Override
    public DoctorLevelApplyQuestionnaireVO getCompanyDoctorLevelApplyQuestionnaire(Long companyId) {
        // 1. 获取当前公司ID
        if (Objects.isNull(companyId)) {
            throw new ServiceException("非法登录");
        }

        // 2. 查询定级申请问卷
        SurveyQuestionnaire questionnaire = surveyQuestionnaireMapper.getCompanyDoctorLevelApplyQuestionnaire(companyId);
        if (questionnaire == null) {
            throw new ServiceException("当前公司未配置医生定级申请问卷");
        }

        // 3. 校验问卷状态（可选）
        if (questionnaire.getStatus() == 0) {
            throw new ServiceException("医生定级申请问卷尚未发布");
        }
        if (questionnaire.getStatus() == 2) {
            throw new ServiceException("医生定级申请问卷已停用");
        }

        // 4. 获取当前版本ID
        Long currentVersionId = questionnaire.getCurrentVersionId();
        if (currentVersionId == null) {
            throw new ServiceException("医生定级申请问卷未发布任何版本");
        }

        // 5. 查询版本信息
        SurveyQuestionnaireVersion surveyQuestionnaireVersion = surveyQuestionnaireVersionMapper
                .selectSurveyQuestionnaireVersionById(currentVersionId);
        if (surveyQuestionnaireVersion == null) {
            throw new ServiceException("版本信息不存在，ID: " + currentVersionId);
        }



        // 7. 返回VO对象
        return new DoctorLevelApplyQuestionnaireVO(questionnaire, surveyQuestionnaireVersion);
    }

    @Override
    public DoctorLevelApplyQuestionnaireVO getAdminDoctorLevelApplyQuestionnaire(Long companyId) {
        // 1. 获取当前公司ID
        if (Objects.isNull(companyId)) {
            throw new ServiceException("非法登录");
        }

        // 2. 查询定级申请问卷
        SurveyQuestionnaire questionnaire = surveyQuestionnaireMapper.getCompanyDoctorLevelApplyQuestionnaire(companyId);
        if (questionnaire == null) {
            throw new ServiceException("当前公司未配置医生定级申请问卷");
        }

        // 3. 校验问卷状态（可选）
        if (questionnaire.getStatus() == 0) {
            throw new ServiceException("医生定级申请问卷尚未发布");
        }
        if (questionnaire.getStatus() == 2) {
            throw new ServiceException("医生定级申请问卷已停用");
        }

        // 4. 获取当前版本ID
        Long currentVersionId = questionnaire.getCurrentVersionId();
        if (currentVersionId == null) {
            throw new ServiceException("医生定级申请问卷未发布任何版本");
        }

        // 5. 查询版本信息
        SurveyQuestionnaireVersion surveyQuestionnaireVersion = surveyQuestionnaireVersionMapper
                .selectSurveyQuestionnaireVersionById(currentVersionId);
        if (surveyQuestionnaireVersion == null) {
            throw new ServiceException("版本信息不存在，ID: " + currentVersionId);
        }



        // 7. 返回VO对象
        return new DoctorLevelApplyQuestionnaireVO(questionnaire, surveyQuestionnaireVersion);
    }


}
