package com.erp.controller;

import com.erp.dto.ApiResponse;
import com.erp.service.ButtonDataflowService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

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

/**
 * 버튼 데이터플로우 컨트롤러 (/api/test-button-dataflow)
 *
 * Node.js buttonDataflowRoutes.ts 포팅.
 */
@RestController
@RequestMapping("/api/button-dataflow")
@RequiredArgsConstructor
@Slf4j
public class ButtonDataflowController {

    private final ButtonDataflowService service;

    // ──────────────────────────────────────────────────────────────
    // 버튼 설정 관리
    // ──────────────────────────────────────────────────────────────

    /** GET /config/:buttonId */
    @GetMapping("/config/{buttonId}")
    public ResponseEntity<ApiResponse<Map<String, Object>>> getButtonDataflowConfig(
            @PathVariable String buttonId) {
        try {
            if (buttonId == null || buttonId.isBlank()) {
                return ResponseEntity.status(400).body(ApiResponse.error("버튼 ID가 필요합니다."));
            }
            return ResponseEntity.ok(ApiResponse.success(service.getButtonDataflowConfig(buttonId)));
        } catch (Exception e) {
            log.error("버튼 설정 조회 오류: buttonId={}", buttonId, e);
            return ResponseEntity.status(500).body(ApiResponse.error("버튼 설정 조회 중 오류가 발생했습니다."));
        }
    }

    /** PUT /config/:buttonId */
    @PutMapping("/config/{buttonId}")
    public ResponseEntity<ApiResponse<Void>> updateButtonDataflowConfig(
            @PathVariable String buttonId,
            @RequestBody Map<String, Object> config) {
        try {
            if (buttonId == null || buttonId.isBlank()) {
                return ResponseEntity.status(400).body(ApiResponse.error("버튼 ID가 필요합니다."));
            }
            service.updateButtonDataflowConfig(buttonId, config);
            return ResponseEntity.ok(ApiResponse.success(null, "버튼 설정이 업데이트되었습니다."));
        } catch (Exception e) {
            log.error("버튼 설정 업데이트 오류: buttonId={}", buttonId, e);
            return ResponseEntity.status(500).body(ApiResponse.error("버튼 설정 업데이트 중 오류가 발생했습니다."));
        }
    }

    // ──────────────────────────────────────────────────────────────
    // 관계도 및 관계 정보 조회
    // ──────────────────────────────────────────────────────────────

    /** GET /diagrams */
    @GetMapping("/diagrams")
    public ResponseEntity<ApiResponse<List<Map<String, Object>>>> getAvailableDiagrams(
            @RequestAttribute("company_code") String companyCode) {
        try {
            if (companyCode == null || companyCode.isBlank()) {
                return ResponseEntity.status(400).body(ApiResponse.error("회사 코드가 필요합니다."));
            }
            return ResponseEntity.ok(ApiResponse.success(service.getAvailableDiagrams(companyCode)));
        } catch (Exception e) {
            log.error("관계도 목록 조회 오류", e);
            return ResponseEntity.status(500).body(ApiResponse.error("관계도 목록 조회 중 오류가 발생했습니다."));
        }
    }

    /** GET /diagrams/:diagramId/relationships */
    @GetMapping("/diagrams/{diagramId}/relationships")
    public ResponseEntity<ApiResponse<List<Map<String, Object>>>> getDiagramRelationships(
            @PathVariable int diagramId,
            @RequestAttribute("company_code") String companyCode) {
        try {
            if (companyCode == null || companyCode.isBlank()) {
                return ResponseEntity.status(400).body(ApiResponse.error("회사 코드가 필요합니다."));
            }
            List<Map<String, Object>> result = service.getDiagramRelationships(diagramId, companyCode);
            if (result == null) {
                return ResponseEntity.status(404).body(ApiResponse.error("관계도를 찾을 수 없습니다."));
            }
            return ResponseEntity.ok(ApiResponse.success(result));
        } catch (Exception e) {
            log.error("관계 목록 조회 오류: diagramId={}", diagramId, e);
            return ResponseEntity.status(500).body(ApiResponse.error("관계 목록 조회 중 오류가 발생했습니다."));
        }
    }

    /** GET /diagrams/:diagramId/relationships/:relationshipId/preview */
    @GetMapping("/diagrams/{diagramId}/relationships/{relationshipId}/preview")
    public ResponseEntity<ApiResponse<Map<String, Object>>> getRelationshipPreview(
            @PathVariable int    diagramId,
            @PathVariable String relationshipId,
            @RequestAttribute("company_code") String companyCode) {
        try {
            if (companyCode == null || companyCode.isBlank()) {
                return ResponseEntity.status(400).body(ApiResponse.error("관계도 ID, 관계 ID, 회사 코드가 필요합니다."));
            }
            Map<String, Object> preview = service.getRelationshipPreview(diagramId, relationshipId, companyCode);
            if (preview == null) {
                return ResponseEntity.status(404).body(ApiResponse.error("관계도를 찾을 수 없습니다."));
            }
            return ResponseEntity.ok(ApiResponse.success(preview));
        } catch (Exception e) {
            log.error("관계 미리보기 조회 오류: diagramId={}, relationshipId={}", diagramId, relationshipId, e);
            return ResponseEntity.status(500).body(ApiResponse.error("관계 미리보기 조회 중 오류가 발생했습니다."));
        }
    }

    // ──────────────────────────────────────────────────────────────
    // 버튼 실행
    // ──────────────────────────────────────────────────────────────

    /** POST /execute-optimized (메인 최적화 실행) */
    @PostMapping("/execute-optimized")
    public ResponseEntity<ApiResponse<Map<String, Object>>> executeOptimizedButton(
            @RequestAttribute("company_code") String companyCode,
            @RequestBody Map<String, Object> body) {
        return doExecuteOptimized(companyCode, body);
    }

    /** POST /execute (레거시 — executeOptimized 와 동일) */
    @PostMapping("/execute")
    public ResponseEntity<ApiResponse<Map<String, Object>>> executeLegacy(
            @RequestAttribute("company_code") String companyCode,
            @RequestBody Map<String, Object> body) {
        return doExecuteOptimized(companyCode, body);
    }

    /** POST /execute-background (레거시 — executeOptimized 와 동일) */
    @PostMapping("/execute-background")
    public ResponseEntity<ApiResponse<Map<String, Object>>> executeBackground(
            @RequestAttribute("company_code") String companyCode,
            @RequestBody Map<String, Object> body) {
        return doExecuteOptimized(companyCode, body);
    }

    /** POST /execute-simple */
    @PostMapping("/execute-simple")
    public ResponseEntity<ApiResponse<Map<String, Object>>> executeSimpleDataflow(
            @RequestAttribute("company_code") String companyCode,
            @RequestBody Map<String, Object> body) {
        try {
            body.put("company_code", companyCode);
            return ResponseEntity.ok(ApiResponse.success(service.executeSimpleDataflow(body)));
        } catch (Exception e) {
            log.error("단순 데이터플로우 실행 오류", e);
            return ResponseEntity.status(500).body(ApiResponse.error("간단한 제어관리 실행 중 오류가 발생했습니다."));
        }
    }

    // ──────────────────────────────────────────────────────────────
    // 작업 상태 조회
    // ──────────────────────────────────────────────────────────────

    /** GET /job-status/:jobId */
    @GetMapping("/job-status/{jobId}")
    public ResponseEntity<ApiResponse<Map<String, Object>>> getJobStatus(@PathVariable String jobId) {
        try {
            return ResponseEntity.ok(ApiResponse.success(service.getJobStatus(jobId)));
        } catch (Exception e) {
            log.error("작업 상태 조회 오류: jobId={}", jobId, e);
            return ResponseEntity.status(500).body(ApiResponse.error("작업 상태 조회 중 오류가 발생했습니다."));
        }
    }

    // ──────────────────────────────────────────────────────────────
    // 테이블 조인 관계 조회
    // ──────────────────────────────────────────────────────────────

    /** GET /join-relationship/:mainTable/:detailTable */
    @GetMapping("/join-relationship/{mainTable}/{detailTable}")
    public ResponseEntity<ApiResponse<Map<String, Object>>> getJoinRelationship(
            @PathVariable String mainTable,
            @PathVariable String detailTable,
            @RequestAttribute("company_code") String companyCode) {
        try {
            if (mainTable == null || detailTable == null) {
                return ResponseEntity.status(400).body(ApiResponse.error("메인 테이블과 디테일 테이블이 필요합니다."));
            }
            Map<String, Object> result = service.getJoinRelationship(mainTable, detailTable, companyCode);
            return ResponseEntity.ok(ApiResponse.success(result));
        } catch (Exception e) {
            log.error("조인 관계 조회 오류: {}/{}", mainTable, detailTable, e);
            return ResponseEntity.status(500).body(ApiResponse.error("조인 관계 조회 실패: " + e.getMessage()));
        }
    }

    // ──────────────────────────────────────────────────────────────
    // Private
    // ──────────────────────────────────────────────────────────────

    private ResponseEntity<ApiResponse<Map<String, Object>>> doExecuteOptimized(
            String companyCode, Map<String, Object> body) {
        try {
            String buttonId   = (String) body.get("button_id");
            String actionType = (String) body.get("action_type");

            if (buttonId == null || actionType == null) {
                return ResponseEntity.status(400).body(ApiResponse.error("필수 파라미터가 누락되었습니다."));
            }
            body.put("company_code", companyCode);
            return ResponseEntity.ok(ApiResponse.success(service.executeOptimizedButton(body)));
        } catch (Exception e) {
            log.error("버튼 실행 오류", e);
            return ResponseEntity.status(500).body(ApiResponse.error("버튼 실행 중 오류가 발생했습니다."));
        }
    }
}
