package com.xdap.self_development.controller;

import com.definesys.mpaas.common.http.Response;
import com.definesys.mpaas.query.db.PageQueryResult;
import com.xdap.self_development.common.MyResponse;
import com.xdap.self_development.controller.form.*;
import com.xdap.self_development.domain.pojo.TemplatePojo;
import com.xdap.self_development.exception.CommonException;
import com.xdap.self_development.service.TemplateService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import java.util.List;

/**
 * 模板控制器
 * 提供模板管理相关的功能，包括模板的增删改查、导入导出、版本管理等
 *
 * @version 1.0
 * @since 2025
 */
@Slf4j
@RestController
@RequestMapping("/custom/template")
public class TemplateController {
    @Resource
    private TemplateService templateService;

    /**
     * 删除模板
     *
     * @param templateId 模板ID
     * @return 操作结果响应
     */
    @GetMapping("/deleteTemplate")
    public Response deleteTemplate(
            @NotBlank @RequestParam String templateId
    ) {
        templateService.deleteTemplate(templateId);
        return Response.ok().setMessage("删除成功");
    }

    /**
     * 模板名的模糊搜索
     *
     * @param form          模板页面表单
     * @param bindingResult 绑定结果
     * @return 模板分页查询结果
     */
    @GetMapping("/getTemplateByCondition")
    public Response getTemplateByCondition(
            @Valid TemplatePageForm form,
            BindingResult bindingResult
    ) {
        if (bindingResult.hasErrors()) {
            bindingResult.getFieldErrors().forEach(error -> {
                throw new CommonException(error.getDefaultMessage());
            });
        }

        PageQueryResult<TemplatePojo> page = templateService.getTemplateByCondition(form);
        return Response.ok().data(page);
    }

    /**
     * 获取指定模板详情
     *
     * @param templateId 模板ID
     * @return 模板详情
     */
    @GetMapping("/getTemplateById")
    public Response getTemplateById(
            @NotBlank String templateId
    ) {
        TemplatePojo template = templateService.getTemplateById(templateId);
        return Response.ok().data(template);
    }


    /**
     * 查看版本（某个模板的全部版本）
     *
     * @param form          模板行ID表单
     * @param bindingResult 绑定结果
     * @return 模板版本列表
     */
    @GetMapping("getTemplateVersion")
    public Response getTemplateVersion(
            @Valid TemplateRowIdForm form,
            BindingResult bindingResult
    ) {
        if (bindingResult.hasErrors()) {
            bindingResult.getFieldErrors().forEach(error -> {
                throw new CommonException(error.getDefaultMessage());
            });
        }
        List<TemplatePojo> list = templateService.getTemplateVersion(form);
        return Response.ok().data(list);
    }

    /**
     * 添加模板
     *
     * @param form          插入模板表单
     * @param bindingResult 绑定结果
     * @return 操作结果响应
     */
    @PostMapping("/insertTemplate")
    public Response insertTemplate(
            @Valid @RequestBody InsertTemplateForm form,
            BindingResult bindingResult
    ) {
        if (bindingResult.hasErrors()) {
            bindingResult.getFieldErrors().forEach(error -> {
                throw new CommonException(error.getDefaultMessage());
            });
        }
        templateService.insertTemplate(form);
        return Response.ok().setMessage("添加成功");
    }

    /**
     * 导入模板（导入全部模板参数和单页模板参数）
     *
     * @param file         文件
     * @param templateRowId 模板行ID
     * @param userId       用户ID
     * @return 操作结果响应
     */
    @PostMapping("/import")
    public Response importTemplate(
            @RequestPart("file") MultipartFile file,
            @RequestPart(value = "templateRowId", required = false) String templateRowId,
            @RequestPart("userId") String userId
    ) {
        MyResponse templateImportProblemView = templateService.importTemplate(file, templateRowId, userId);
        if (!templateImportProblemView.getErrors().isEmpty()) {
            return Response.error("导入异常").data(templateImportProblemView);
        } else {
            return Response.ok().setMessage("导入成功");
        }
    }

    /**
     * 修改模板
     *
     * @param form          更新模板表单
     * @param bindingResult 绑定结果
     * @return 操作结果响应
     */
    @PostMapping("/updateTemplate")
    public Response updateTemplate(
            @Valid @RequestBody UpdateTemplateForm form,
            BindingResult bindingResult
    ) {
        if (bindingResult.hasErrors()) {
            bindingResult.getFieldErrors().forEach(error -> {
                throw new CommonException(error.getDefaultMessage());
            });
        }
        templateService.updateTemplate(form);
        return Response.ok().setMessage("修改成功");
    }

    /**
     * 下载（空模板或全参模板）
     *
     * @param form          导出模板表单
     * @param response      HTTP响应
     * @param bindingResult 绑定结果
     */
    @GetMapping("/export")
    public void exportTemplate(
            @Valid ExportTemplateForm form,
            HttpServletResponse response,
            BindingResult bindingResult
    ) {
        if (bindingResult.hasErrors()) {
            bindingResult.getFieldErrors().forEach(error -> {
                throw new CommonException(error.getDefaultMessage());
            });
        }
        templateService.exportTemplate(form, response);
    }

    /**
     * 导出所有模板
     *
     * @param response HTTP响应
     */
    @GetMapping("/exportMultiple")
    public void exportMultipleTemplates(HttpServletResponse response) {
        templateService.exportMultipleTemplates(response);
    }
}
