package incheon.ags.dss.green.web;

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

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import incheon.com.cmm.api.DefaultApiResponse;
import incheon.ags.dss.green.service.UrbGrnznAnlsService;
import incheon.ags.dss.green.vo.UrbGrnznAnlsDtlVO;
import incheon.ags.dss.green.vo.UrbGrnznAnlsMstVO;
// DTO Import
import incheon.ags.dss.green.web.dto.UrbGrnznAnlsResponseDTO;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Tag(name = "도시재생-녹지공간(편집/분석)", description = "녹지 공간 분석 실행, 결과 조회 및 지도 데이터 표출 API")
@RestController
@RequiredArgsConstructor
@Slf4j
@RequestMapping("/api/v1/dss/urb/grnznAnls")
public class UrbGrnznAnlsApiController {

    private final UrbGrnznAnlsService service;

//  /api/v1/dss/common/guList.do
//  
///api/v1/dss/common/dongList.do
//    
///api/v1/dss/common/getEmdData.do
//
///api/v1/dss/common/findIntersectingArea.do
    
    /** 분석 실행 (POST) */
    @Operation(summary = "녹지 분석 실행", description = "설정된 파라미터(MstVO)를 기반으로 녹지 공간 분석 알고리즘을 수행합니다.")
    @PostMapping("/run.do")
    public ResponseEntity<DefaultApiResponse> runAnalysis(
            @Parameter(description = "분석 설정 정보 (구역번호, 파라미터 등)", required = true) 
            @RequestBody UrbGrnznAnlsMstVO vo) throws Exception {
        
        service.runGreenAnalysis(vo);
        return ResponseEntity.ok(DefaultApiResponse.success(null, "분석이 완료되었습니다."));
    }

    /** * 분석 결과 조회 (Master) - DTO 반환 적용 
     */
    @Operation(summary = "분석 결과 조회 (단건)", description = "특정 구역(zoneNo)의 최종 분석 결과(Master)를 조회합니다.")
    @GetMapping("/result.do")
    public ResponseEntity<DefaultApiResponse> getResult(
            @Parameter(description = "구역 번호", required = true, example = "1001") 
            @RequestParam("zoneNo") int zoneNo) throws Exception {
        
        // 1. Service 호출 (VO 반환)
        UrbGrnznAnlsMstVO resultVO = service.selectGreenAnalysisResult(zoneNo);
        
        // 2. VO -> DTO 변환
        UrbGrnznAnlsResponseDTO resultDTO = UrbGrnznAnlsResponseDTO.from(resultVO);
        
        return ResponseEntity.ok(DefaultApiResponse.success(resultDTO, "조회되었습니다."));
    }

    /** * 녹지 공간 목록 조회 (Detail - 지도용) - DTO 반환 적용 
     */
    @Operation(summary = "녹지 공간 상세 목록 (GIS 표출용)", description = "분석 번호(anlsNo)에 해당하는 상세 녹지 데이터 목록을 반환합니다. 지도 시각화에 사용됩니다.")
    @GetMapping("/zones.do")
    public ResponseEntity<DefaultApiResponse> getZones(
            @Parameter(description = "분석 번호", required = true, example = "5") 
            @RequestParam("anlsNo") Integer anlsNo) throws Exception {
        
        // 1. Service 호출 (List<VO> 반환)
        List<UrbGrnznAnlsDtlVO> listVO = service.selectGreenZoneList(anlsNo);
        
        // 2. List<VO> -> List<DTO> 변환
        List<UrbGrnznAnlsResponseDTO.GreenZone> listDTO = UrbGrnznAnlsResponseDTO.fromDetailList(listVO);
        
        return ResponseEntity.ok(DefaultApiResponse.success(Map.of("list", listDTO), "조회되었습니다."));
    }
    
    /** 녹지 공간 편집 저장 (추가/삭제) */
    @Operation(summary = "녹지 공간 편집 저장", description = "사용자가 지도에서 추가(그리기/선택)하거나 삭제한 녹지 공간 데이터를 저장하고, 분석 결과(면적)를 갱신합니다.")
    @PostMapping("/saveZones.do")
    public ResponseEntity<DefaultApiResponse> saveZones(
            @Parameter(description = "구역 번호(Zone No) - 최초 생성 시 필요", required = true, example = "99") 
            @RequestParam("zoneNo") int zoneNo,
            @Parameter(description = "편집된 녹지 공간 리스트 (Insert)", required = true) 
            @RequestBody List<UrbGrnznAnlsDtlVO> list) throws Exception {
        
        if (list == null || list.isEmpty()) {
             // 빈 리스트가 와도 로직상 기존 데이터를 지우는 행위일 수 있으므로 통과시키거나, 정책에 따라 처리
        }

        service.saveGreenZoneDetails(zoneNo, list);
        
        return ResponseEntity.ok(DefaultApiResponse.success(null, "저장 및 재계산이 완료되었습니다."));
    }
}