package com.erp.controller;

import com.erp.dto.ApiResponse;
import com.erp.service.NodeFlowService;
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/dataflow/node-flows)
 *
 * Node.js node-flows.ts 포팅.
 */
@RestController
@RequestMapping("/api/dataflow/node-flows")
@RequiredArgsConstructor
@Slf4j
public class NodeFlowController {

    private final NodeFlowService service;

    // ──────────────────────────────────────────────────────────────
    // 목록 조회
    // ──────────────────────────────────────────────────────────────

    /** GET / */
    @GetMapping
    public ResponseEntity<ApiResponse<List<Map<String, Object>>>> getFlowList(
            @RequestAttribute("company_code") String companyCode) {
        try {
            return ResponseEntity.ok(ApiResponse.success(service.getFlowList(companyCode)));
        } catch (Exception e) {
            log.error("플로우 목록 조회 오류", e);
            return ResponseEntity.status(500).body(ApiResponse.error("플로우 목록 조회 중 오류가 발생했습니다."));
        }
    }

    // ──────────────────────────────────────────────────────────────
    // 상세 조회
    // ──────────────────────────────────────────────────────────────

    /** GET /{flowId} */
    @GetMapping("/{flowId}")
    public ResponseEntity<ApiResponse<Map<String, Object>>> getFlowById(
            @PathVariable int flowId,
            @RequestAttribute("company_code") String companyCode) {
        try {
            Map<String, Object> flow = service.getFlowById(flowId, companyCode);
            if (flow == null) {
                return ResponseEntity.status(404).body(ApiResponse.error("플로우를 찾을 수 없습니다."));
            }
            return ResponseEntity.ok(ApiResponse.success(flow));
        } catch (Exception e) {
            log.error("플로우 상세 조회 오류: flowId={}", flowId, e);
            return ResponseEntity.status(500).body(ApiResponse.error("플로우 조회 중 오류가 발생했습니다."));
        }
    }

    // ──────────────────────────────────────────────────────────────
    // 생성
    // ──────────────────────────────────────────────────────────────

    /** POST / */
    @PostMapping
    public ResponseEntity<ApiResponse<Map<String, Object>>> createFlow(
            @RequestAttribute("company_code") String companyCode,
            @RequestAttribute("user_id")      String userId,
            @RequestAttribute("user_name")    String userName,
            @RequestBody Map<String, Object> body) {
        try {
            body.put("company_code", companyCode);
            body.put("user_id",      userId);
            body.put("user_name",    userName);
            return ResponseEntity.ok(ApiResponse.success(service.createFlow(body)));
        } catch (IllegalArgumentException e) {
            return ResponseEntity.status(400).body(ApiResponse.error(e.getMessage()));
        } catch (Exception e) {
            log.error("플로우 생성 오류", e);
            return ResponseEntity.status(500).body(ApiResponse.error("플로우 생성 중 오류가 발생했습니다."));
        }
    }

    // ──────────────────────────────────────────────────────────────
    // 수정
    // ──────────────────────────────────────────────────────────────

    /** PUT / (flowId는 body에 포함) */
    @PutMapping
    public ResponseEntity<ApiResponse<Map<String, Object>>> updateFlow(
            @RequestAttribute("company_code") String companyCode,
            @RequestAttribute("user_id")      String userId,
            @RequestAttribute("user_name")    String userName,
            @RequestBody Map<String, Object> body) {
        try {
            body.put("company_code", companyCode);
            body.put("user_id",      userId);
            body.put("user_name",    userName);
            return ResponseEntity.ok(ApiResponse.success(service.updateFlow(body)));
        } catch (IllegalArgumentException e) {
            return ResponseEntity.status(400).body(ApiResponse.error(e.getMessage()));
        } catch (Exception e) {
            log.error("플로우 수정 오류", e);
            return ResponseEntity.status(500).body(ApiResponse.error("플로우 수정 중 오류가 발생했습니다."));
        }
    }

    // ──────────────────────────────────────────────────────────────
    // 삭제
    // ──────────────────────────────────────────────────────────────

    /** DELETE /{flowId} */
    @DeleteMapping("/{flowId}")
    public ResponseEntity<ApiResponse<Void>> deleteFlow(
            @PathVariable int flowId,
            @RequestAttribute("company_code") String companyCode,
            @RequestAttribute("user_id")      String userId,
            @RequestAttribute("user_name")    String userName) {
        try {
            service.deleteFlow(flowId, companyCode, userId, userName);
            return ResponseEntity.ok(ApiResponse.success(null, "플로우가 삭제되었습니다."));
        } catch (IllegalArgumentException e) {
            return ResponseEntity.status(404).body(ApiResponse.error(e.getMessage()));
        } catch (Exception e) {
            log.error("플로우 삭제 오류: flowId={}", flowId, e);
            return ResponseEntity.status(500).body(ApiResponse.error("플로우 삭제 중 오류가 발생했습니다."));
        }
    }

    // ──────────────────────────────────────────────────────────────
    // 소스 테이블 추출
    // ──────────────────────────────────────────────────────────────

    /** GET /{flowId}/source-table */
    @GetMapping("/{flowId}/source-table")
    public ResponseEntity<ApiResponse<Map<String, Object>>> getSourceTable(
            @PathVariable int flowId) {
        try {
            Map<String, Object> result = service.getSourceTable(flowId);
            if (result == null) {
                return ResponseEntity.status(404).body(ApiResponse.error("소스 테이블을 찾을 수 없습니다."));
            }
            return ResponseEntity.ok(ApiResponse.success(result));
        } catch (Exception e) {
            log.error("소스 테이블 추출 오류: flowId={}", flowId, e);
            return ResponseEntity.status(500).body(ApiResponse.error("소스 테이블 추출 중 오류가 발생했습니다."));
        }
    }

    // ──────────────────────────────────────────────────────────────
    // 플로우 실행
    // ──────────────────────────────────────────────────────────────

    /** POST /{flowId}/execute */
    @PostMapping("/{flowId}/execute")
    public ResponseEntity<ApiResponse<Map<String, Object>>> executeFlow(
            @PathVariable int flowId,
            @RequestAttribute("company_code") String companyCode,
            @RequestAttribute("user_id")      String userId,
            @RequestAttribute("user_name")    String userName,
            @RequestBody(required = false) Map<String, Object> body) {
        try {
            Map<String, Object> contextData = body != null ? body : new java.util.LinkedHashMap<>();
            contextData.put("company_code", companyCode);
            contextData.put("user_id",      userId);
            contextData.put("user_name",    userName);

            Map<String, Object> result = service.executeFlow(flowId, contextData);
            return ResponseEntity.ok(ApiResponse.success(result));
        } catch (IllegalArgumentException e) {
            return ResponseEntity.status(404).body(ApiResponse.error(e.getMessage()));
        } catch (Exception e) {
            log.error("플로우 실행 오류: flowId={}", flowId, e);
            return ResponseEntity.status(500).body(ApiResponse.error("플로우 실행 중 오류가 발생했습니다."));
        }
    }
}
