package com.agileboot.codegen.controller;

import com.agileboot.codegen.dto.TemplateRepositoryDTO;
import com.agileboot.codegen.entity.UserTemplateRepository;
import com.agileboot.codegen.service.ITemplateRepositoryService;
import com.agileboot.common.core.core.R;
import com.agileboot.common.satoken.utils.LoginHelper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * 模板仓库管理 Controller
 * 
 * @author system
 * @date 2025-09-26
 */
@RestController
@RequestMapping("/codegen/repository")
@Slf4j
@RequiredArgsConstructor
public class TemplateRepositoryController {

    private final ITemplateRepositoryService templateRepositoryService;

    /**
     * 获取用户的模板仓库列表（用于仓库管理界面）
     */
    @GetMapping("/list")
    public R<List<UserTemplateRepository>> getUserRepositoryList() {
        Long userId = LoginHelper.getUserId();
        List<UserTemplateRepository> result = templateRepositoryService.getUserRepositoryList(userId);
        return R.ok(result);
    }

    /**
     * 获取所有可用模板（系统模板+公开用户模板）
     */
    @GetMapping("/available")
    public R<List<TemplateRepositoryDTO>> getAvailableTemplates() {
        Long userId = LoginHelper.getUserId();
        List<TemplateRepositoryDTO> result = templateRepositoryService.getAvailableTemplates(userId);
        return R.ok(result);
    }

    /**
     * 添加模板到用户仓库
     */
    @PostMapping("/add")
    public R<Void> addTemplateToRepository(@RequestBody TemplateRepositoryDTO dto) {
        try {
            Long userId = LoginHelper.getUserId();
            boolean success = templateRepositoryService.addTemplateToRepository(
                    userId, dto.getTemplateSource(), dto.getTemplateId(), 
                    dto.getTemplateName(), dto.getTemplateGroup());
            
            return success ? R.ok() : R.fail("添加模板到仓库失败");
        } catch (Exception e) {
            log.error("添加模板到仓库失败", e);
            return R.fail(e.getMessage());
        }
    }


    /**
     * 切换模板启用状态
     */
    @PostMapping("/toggle")
    public R<Void> toggleTemplateStatus(@RequestBody Map<String, Object> params) {
        try {
            String templateSource = params.get("templateSource").toString();
            String templateId = params.get("templateId").toString();
            Integer isEnabled = Integer.parseInt(params.get("isEnabled").toString());
            Long userId = LoginHelper.getUserId();
            boolean success = templateRepositoryService.toggleTemplateStatus(userId, templateSource, templateId, isEnabled);
            
            return success ? R.ok() : R.fail("切换模板状态失败");
        } catch (Exception e) {
            log.error("切换模板状态失败", e);
            return R.fail(e.getMessage());
        }
    }

    /**
     * 批量更新模板排序
     */
    @PostMapping("/sort")
    public R<Void> updateTemplateSort(@RequestBody List<TemplateRepositoryDTO> templates) {
        try {
            Long userId = LoginHelper.getUserId();
            boolean success = templateRepositoryService.updateTemplateSort(userId, templates);
            
            return success ? R.ok() : R.fail("更新模板排序失败");
        } catch (Exception e) {
            log.error("更新模板排序失败", e);
            return R.fail(e.getMessage());
        }
    }

    /**
     * 初始化用户模板仓库
     */
    @PostMapping("/init")
    public R<Void> initUserRepository() {
        try {
            Long userId = LoginHelper.getUserId();
            boolean success = templateRepositoryService.initUserRepository(userId);
            
            return success ? R.ok() : R.fail("初始化用户模板仓库失败");
        } catch (Exception e) {
            log.error("初始化用户模板仓库失败", e);
            return R.fail(e.getMessage());
        }
    }

    /**
     * 检查模板是否已添加到用户仓库
     */
    @GetMapping("/check")
    public R<Boolean> checkTemplateExists(@RequestParam String templateSource, 
                                         @RequestParam String templateId) {
        Long userId = LoginHelper.getUserId();
        boolean exists = templateRepositoryService.checkTemplateExists(userId, templateSource, templateId);
        return R.ok(exists);
    }
}

