package com.haha.admin.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.haha.admin.annotation.RequirePermission;
import com.haha.common.dto.LayerTemplateCreateDTO;
import com.haha.entity.dto.LayerTemplateQueryDTO;
import com.haha.common.dto.LayerTemplateUpdateDTO;
import com.haha.common.annotation.Log;
import com.haha.common.enums.OperationType;
import com.haha.common.vo.Result;
import com.haha.entity.LayerTemplate;
import com.haha.service.LayerTemplateService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

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

/**
 * 设备模版管理控制器
 * 支持设备模版(LAYER)和柜模版(CABINET)两种类型
 */
@Slf4j
@RestController
@RequestMapping("/layer-templates")
@RequiredArgsConstructor
public class LayerTemplateController {

    private final LayerTemplateService layerTemplateService;

    /**
     * 分页查询设备模版列表
     * @param queryDTO 查询参数
     * @return 设备模版列表
     */
    @RequirePermission("layer-template:read")
    @GetMapping("/list")
    public Result<Map<String, Object>> list(LayerTemplateQueryDTO queryDTO) {
        queryDTO.validate();

        IPage<LayerTemplate> templatePage = layerTemplateService.getPage(
                queryDTO.getPage(),
                queryDTO.getPageSize(),
                queryDTO.getDeviceId(),
                queryDTO.getSyncStatus(),
                queryDTO.getTemplateName(),
                queryDTO.getTemplateType()
        );

        // 构造前端需要的分页数据格式
        Map<String, Object> result = new HashMap<>();
        result.put("list", templatePage.getRecords());
        result.put("total", templatePage.getTotal());
        result.put("pageSize", templatePage.getSize());
        result.put("currentPage", templatePage.getCurrent());
        result.put("totalPages", templatePage.getPages());

        return Result.success("查询成功", result);
    }

    /**
     * 获取设备模版详情
     * @param id 模版ID
     * @return 设备模版详情
     */
    @RequirePermission("layer-template:read")
    @GetMapping("/{id}")
    public Result<LayerTemplate> getById(@PathVariable Long id) {
        LayerTemplate template = layerTemplateService.getById(id);
        if (template == null) {
            return Result.error(404, "设备模版不存在");
        }
        return Result.success("查询成功", template);
    }

    /**
     * 根据设备ID获取设备模版
     * @param deviceId 设备ID
     * @return 设备模版信息
     */
    @RequirePermission("layer-template:read")
    @GetMapping("/device/{deviceId}")
    public Result<LayerTemplate> getByDeviceId(@PathVariable String deviceId) {
        LayerTemplate template = layerTemplateService.getByDeviceId(deviceId);
        if (template == null) {
            return Result.error(404, "该设备的设备模版不存在");
        }
        return Result.success("查询成功", template);
    }

    /**
     * 创建设备模版
     * @param dto 设备模版信息
     * @return 创建结果
     */
    @RequirePermission("layer-template:create")
    @Log(module = "设备设备模版管理", operation = OperationType.INSERT, summary = "创建设备模版")
    @PostMapping
    public Result<LayerTemplate> create(@RequestBody LayerTemplateCreateDTO dto) {
        LayerTemplate saved = layerTemplateService.create(dto);
        return Result.success("创建成功", saved);
    }

    /**
     * 更新设备模版
     * @param id 模版ID
     * @param dto 设备模版信息
     * @return 更新结果
     */
    @RequirePermission("layer-template:update")
    @Log(module = "设备设备模版管理", operation = OperationType.UPDATE, summary = "更新设备模版")
    @PutMapping("/{id}")
    public Result<LayerTemplate> update(@PathVariable Long id, @RequestBody LayerTemplateUpdateDTO dto) {
        LayerTemplate saved = layerTemplateService.update(id, dto);
        return Result.success("更新成功", saved);
    }

    /**
     * 删除设备模版（软删除）
     * @param id 模版ID
     * @return 删除结果
     */
    @RequirePermission("layer-template:delete")
    @Log(module = "设备设备模版管理", operation = OperationType.DELETE, summary = "删除设备模版")
    @DeleteMapping("/{id}")
    public Result<Void> delete(@PathVariable Long id) {
        boolean success = layerTemplateService.softDelete(id);
        return success ? Result.success("删除成功", null) : Result.error(500, "删除失败");
    }

    /**
     * 从哈哈平台同步单个设备设备模版
     * @param deviceId 设备ID
     * @return 同步结果
     */
    @RequirePermission("layer-template:update")
    @Log(module = "设备设备模版管理", operation = OperationType.SYNC, summary = "同步设备模版")
    @PostMapping("/{deviceId}/sync")
    public Result<Void> sync(@PathVariable String deviceId) {
        boolean success = layerTemplateService.syncFromHaha(deviceId);
        return success ? Result.success("同步成功", null) : Result.error(500, "同步失败");
    }

    /**
     * 批量同步设备模版
     * @param deviceIds 设备ID列表
     * @return 批量同步结果
     */
    @RequirePermission("layer-template:update")
    @Log(module = "设备设备模版管理", operation = OperationType.SYNC, summary = "批量同步设备模版")
    @PostMapping("/sync/batch")
    public Result<Map<String, Object>> batchSync(@RequestBody List<String> deviceIds) {
        Map<String, Object> syncResult = layerTemplateService.batchSync(deviceIds);

        int successCount = (int) syncResult.getOrDefault("successCount", 0);
        int failCount = (int) syncResult.getOrDefault("failCount", 0);

        if (failCount > 0 && successCount == 0) {
            return Result.error(500, "批量同步全部失败");
        } else if (failCount > 0) {
            return Result.success("批量同步完成（部分失败）", syncResult);
        }
        return Result.success("批量同步成功", syncResult);
    }
}
