package incheon.ags.uis.link.web;

import incheon.ags.uis.link.util.OracleHandler;
import incheon.com.cmm.api.DefaultApiResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

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

/**
 * 시설물 연계 API 컨트롤러
 *
 * @author jiwon
 * @since 2025-12-29
 */
@RestController
@RequestMapping("/api/v1/uis/link")
@RequiredArgsConstructor
@Slf4j
public class AgsUisLinkApiController {

    private final OracleHandler oracleHandler;

    /**
     * Oracle 테이블 데이터 미리보기
     *
     * @param tableName Oracle 테이블명
     * @return 미리보기 데이터 (최대 10건)
     */
    @GetMapping("/preview.do")
    public ResponseEntity<DefaultApiResponse<List<Map<String, Object>>>> preview(
            @RequestParam String tableName) {

        log.info("Oracle 테이블 미리보기 요청: {}", tableName);

        // 입력값 검증
        if (!StringUtils.hasText(tableName)) {
            return ResponseEntity.badRequest().body(
                    DefaultApiResponse.error(400, "테이블명은 필수입니다", "BAD_REQUEST")
            );
        }

        try {
            // Oracle에서 데이터 조회 (최대 10건)
            List<Map<String, Object>> previewData = oracleHandler.selectTableDataPreview(tableName);
            int totalCount = oracleHandler.countTableData(tableName);

            log.info("Oracle 테이블 미리보기 조회 완료: {} (전체 {}건 중 {}건 미리보기)",
                    tableName, totalCount, previewData.size());

            // 응답 생성
            DefaultApiResponse<List<Map<String, Object>>> response =
                    DefaultApiResponse.success(previewData, "미리보기 조회 완료");

            // 메타 정보 추가
            response.addMeta("tableName", tableName);
            response.addMeta("previewCount", previewData.size());
            response.addMeta("totalCount", totalCount);

            return ResponseEntity.ok(response);

        } catch (Exception e) {
            log.error("Oracle 테이블 미리보기 중 오류 발생: {}", e.getMessage(), e);
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(
                    DefaultApiResponse.error(500, "데이터 조회 중 오류가 발생했습니다", e.getMessage())
            );
        }
    }

    /**
     * 시설물 데이터 연계 실행 (Oracle → PostgreSQL)
     *
     * @param linkId 연계 ID
     * @return 연계 결과
     */
    @PostMapping("/execute.do")
    public ResponseEntity<DefaultApiResponse<Map<String, Object>>> execute(
            @RequestParam Long linkId) {

        log.info("시설물 연계 실행 요청: linkId={}", linkId);

        // TODO: 실제 연계 로직 구현
        // 1. linkId로 연계 정보 조회 (테이블명, 시설물 타입 등)
        // 2. Oracle에서 전체 데이터 조회
        // 3. PostgreSQL 테이블 truncate
        // 4. PostgreSQL 테이블에 insert

        Map<String, Object> result = new HashMap<>();
        result.put("linkId", linkId);
        result.put("status", "NOT_IMPLEMENTED");
        result.put("message", "연계 기능은 추후 구현 예정입니다");

        return ResponseEntity.ok(
                DefaultApiResponse.success(result, "연계 실행 (준비 중)")
        );
    }
}