package com.fs.survey.service.impl;

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

import com.fs.common.config.LoginContextManager;
import com.fs.common.exception.ServiceException;
import com.fs.common.utils.DateUtils;
import com.fs.common.utils.SecurityUtils;
import com.fs.company.domain.CompanyUser;
import com.fs.company.service.ICompanyUserService;
import com.fs.survey.domain.SurveyQuestionnaire;
import com.fs.survey.domain.SurveyQuestionnaireVersion;
import com.fs.survey.mapper.SurveyQuestionnaireMapper;
import com.fs.survey.mapper.SurveyQuestionnaireVersionMapper;
import com.fs.survey.service.DynamicTableService;
import com.fs.survey.service.ISurveyQuestionnaireVersionService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * 问卷版本Service业务层处理
 *
 */
@Slf4j
@Service
public class SurveyQuestionnaireVersionServiceImpl implements ISurveyQuestionnaireVersionService {
    @Autowired
    private SurveyQuestionnaireVersionMapper versionMapper;

    @Autowired
    private DynamicTableService dynamicTableService;

    @Autowired
    private SurveyQuestionnaireMapper surveyQuestionnaireMapper;
    @Autowired
    private ICompanyUserService companyUserService;
    /**
     * 查询问卷版本
     *
     * @param id 问卷版本主键
     * @return 问卷版本
     */
    @Override
    public SurveyQuestionnaireVersion selectSurveyQuestionnaireVersionById(Long id) {
        return versionMapper.selectSurveyQuestionnaireVersionById(id);
    }

    /**
     * 查询问卷版本列表
     *
     * @param surveyQuestionnaireVersion 问卷版本
     * @return 问卷版本
     */
    @Override
    public List<SurveyQuestionnaireVersion> selectSurveyQuestionnaireVersionList(SurveyQuestionnaireVersion surveyQuestionnaireVersion) {
        return versionMapper.selectSurveyQuestionnaireVersionList(surveyQuestionnaireVersion);
    }

    /**
     * 保存版本(新增或更新)
     *
     * @param surveyQuestionnaireVersion 问卷版本
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Long saveVersion(SurveyQuestionnaireVersion surveyQuestionnaireVersion) {
        surveyQuestionnaireVersion.setCreateTime(DateUtils.getNowDate());
        surveyQuestionnaireVersion.setCompanyId(LoginContextManager.getCurrentCompanyId());

        SurveyQuestionnaire surveyQuestionnaire = surveyQuestionnaireMapper.selectSurveyQuestionnaireById(surveyQuestionnaireVersion.getQuestionnaireId());

        if (surveyQuestionnaireVersion.getId() != null) {
            // 更新现有版本
            versionMapper.updateSurveyQuestionnaireVersion(surveyQuestionnaireVersion);

        } else {
            // 创建新版本
            // 获取最大版本号
            Integer maxVersionNo = versionMapper.selectMaxVersionNo(surveyQuestionnaireVersion.getQuestionnaireId());
            surveyQuestionnaireVersion.setVersionNo(maxVersionNo + 1);
            surveyQuestionnaireVersion.setStatus(0); // 草稿状态

            versionMapper.insertSurveyQuestionnaireVersion(surveyQuestionnaireVersion);
        }

        // 获取版本ID（新增时会自动回填，更新时本身就有ID）
        Long versionId = surveyQuestionnaireVersion.getId();

        surveyQuestionnaire.setCurrentVersionId(versionId);
        surveyQuestionnaireMapper.updateSurveyQuestionnaire(surveyQuestionnaire);


        log.info("surveyQuestionnaireVersion: {}", surveyQuestionnaireVersion);
        return versionId;
    }

    /**
     * 修改问卷版本
     *
     * @param surveyQuestionnaireVersion 问卷版本
     * @return 结果
     */
    @Override
    public int updateSurveyQuestionnaireVersion(SurveyQuestionnaireVersion surveyQuestionnaireVersion) {
        surveyQuestionnaireVersion.setUpdateTime(DateUtils.getNowDate());
        return versionMapper.updateSurveyQuestionnaireVersion(surveyQuestionnaireVersion);
    }

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

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

    /**
     * 发布版本
     *
     * @param id 版本ID
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int publishVersion(Long id) {
        SurveyQuestionnaireVersion version = versionMapper.selectSurveyQuestionnaireVersionById(id);

        if (version == null) {
            throw new ServiceException("版本不存在");
        }

        if (version.getStatus() == 1) {
            throw new ServiceException("版本已发布,无需重复发布");
        }

        // 创建动态表
        String tableName = dynamicTableService.createDynamicTable(
            version.getCompanyId(),
            version.getQuestionnaireId(),
            version.getId(),
            version.getFormJson()
        );

        // 更新版本状态
        version.setTableName(tableName);
        version.setStatus(1); // 已发布
        version.setPublishTime(new Date());
        version.setPublishBy(SecurityUtils.getUsername());

        return versionMapper.updateSurveyQuestionnaireVersion(version);
    }

    @Transactional
    @Override
    public int companyPublishVersion(Long id) {
        Long currentUserId = LoginContextManager.getCurrentCompanyUserId();
        Long currentCompanyId = LoginContextManager.getCurrentCompanyId();
        if(Objects.isNull(currentUserId)){
            throw new ServiceException("请登陆后操作");
        }
        CompanyUser companyUser = companyUserService.selectCompanyUserById(currentUserId);
        if(Objects.isNull(companyUser)){
            throw new ServiceException("非法登录");
        }
        SurveyQuestionnaireVersion version = versionMapper.selectSurveyQuestionnaireVersionById(id);

        if (version == null) {
            throw new ServiceException("版本不存在");
        }

        Long questionnaireId = version.getQuestionnaireId();
        if (questionnaireId == null) {
            throw new IllegalArgumentException("问卷id不存在");
        }
        SurveyQuestionnaire questionnaire = surveyQuestionnaireMapper.selectSurveyQuestionnaireById(questionnaireId);
        if (questionnaire == null) {
            throw new ServiceException("Questionnaire not found with id: " + questionnaireId);
        }

        if (questionnaire.getStatus() == 3) {
            questionnaire.setStatus(1);
            surveyQuestionnaireMapper.updateSurveyQuestionnaire(questionnaire);
        }


        if (version.getStatus() == 1) {
            throw new ServiceException("版本已发布,无需重复发布");
        }




        // 创建动态表
        String tableName = dynamicTableService.createDynamicTable(
                version.getCompanyId(),
                version.getQuestionnaireId(),
                version.getId(),
                version.getFormJson()
        );

        // 更新版本状态
        version.setTableName(tableName);
        // 已发布
        version.setStatus(1);
        version.setPublishTime(new Date());
        version.setPublishBy(companyUser.getNickName());

        return versionMapper.updateSurveyQuestionnaireVersion(version);
    }

    @Override
    public SurveyQuestionnaireVersion getLatestInfo(Long id) {
        return versionMapper.getLatestInfo(id);
    }
}
