package incheon.cmm.g2f.search.web;

import incheon.cmm.g2f.search.service.AddressService;
import incheon.cmm.g2f.search.service.AdmService;
import incheon.cmm.g2f.search.vo.AddressCoordinateVO;
import incheon.cmm.g2f.search.vo.AdmRequestDTO;
import incheon.cmm.g2f.search.vo.AdmResultVO;
import incheon.cmm.g2f.search.vo.JibunSearchResultVO;
import incheon.com.cmm.api.DefaultApiResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

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

@Tag(name = "검색 API")
@RestController
@RequestMapping("/cmm/g2f/search")
@RequiredArgsConstructor
public class G2FSearchController {

    private static final Logger logger = LoggerFactory.getLogger(G2FSearchController.class);

    private final AdmService admService;
    private final AddressService addressService;

    @Operation(summary = "행정 구역 조회", description = "행정 구역을 조회합니다.")
    @ApiResponses(value = {
            @ApiResponse(responseCode = "200", description = "조회 성공",
                    content = @Content(schema = @Schema(implementation = DefaultApiResponse.class))),
            @ApiResponse(responseCode = "400", description = "요청 파라미터 오류"),
            @ApiResponse(responseCode = "404", description = "레이어를 찾을 수 없음"),
            @ApiResponse(responseCode = "500", description = "서버 내부 오류")
    })

    @GetMapping("/adm")
    public ResponseEntity<DefaultApiResponse<Map<String, Object>>> getAdmList(AdmRequestDTO admRequestDTO) {
        if (admRequestDTO.getPageIndex() < 1) {
            admRequestDTO.setPageIndex(1);
        }
        List<AdmResultVO> content = null;

        content = admService.selectAdmList(admRequestDTO);

        Map<String, Object> response = new HashMap<>();
        response.put("content", content);
        if(admRequestDTO.getPageSize() > 1) {
            response.put("page", admRequestDTO.getPageIndex());
            response.put("size", admRequestDTO.getPageSize());

            long total = admService.selectAdmListTotCnt(admRequestDTO);
            response.put("totalElements", total);
            response.put("totalPages", (int) Math.ceil((double) total / admRequestDTO.getPageSize()));
        }

        return ResponseEntity.ok(DefaultApiResponse.success(response));
    }

    @Operation(summary = "주소 좌표 조회", description = "건물관리번호로 좌표를 조회합니다.")
    @ApiResponses(value = {
        @ApiResponse(responseCode = "200", description = "조회 성공",
            content = @Content(schema = @Schema(implementation = DefaultApiResponse.class))),
        @ApiResponse(responseCode = "400", description = "요청 파라미터 오류"),
        @ApiResponse(responseCode = "404", description = "주소를 찾을 수 없음"),
        @ApiResponse(responseCode = "500", description = "서버 내부 오류")
    })
    @GetMapping("/address/coordinate")
    public ResponseEntity<DefaultApiResponse<AddressCoordinateVO>> getAddressCoordinate(
            @RequestParam String bldgMngNo) {
        logger.info("주소 좌표 조회 요청: bldgMngNo={}", bldgMngNo);

        AddressCoordinateVO coordinate = addressService.getCoordinateByBldgMngNo(bldgMngNo);

        return ResponseEntity.ok(DefaultApiResponse.success(coordinate));
    }

    @Operation(summary = "주소 좌표 조회", description = "건물관리번호로 좌표를 조회합니다.")
    @ApiResponses(value = {
            @ApiResponse(responseCode = "200", description = "조회 성공",
                    content = @Content(schema = @Schema(implementation = DefaultApiResponse.class))),
            @ApiResponse(responseCode = "400", description = "요청 파라미터 오류"),
            @ApiResponse(responseCode = "404", description = "주소를 찾을 수 없음"),
            @ApiResponse(responseCode = "500", description = "서버 내부 오류")
    })
    @PostMapping("/address/coordinates")
    public ResponseEntity<DefaultApiResponse<List<AddressCoordinateVO>>> getAddressCoordinates(
            @RequestBody List<String> bldgMngNoList) {
        List<AddressCoordinateVO> coordinates = addressService.getCoordinatesByBldgMngNo(bldgMngNoList);
        return ResponseEntity.ok(DefaultApiResponse.success(coordinates));
    }


    @Operation(summary = "지번 검색", description = "지번을 검색합니다.")
    @ApiResponses(value = {
            @ApiResponse(responseCode = "200", description = "조회 성공",
                    content = @Content(schema = @Schema(implementation = DefaultApiResponse.class))),
            @ApiResponse(responseCode = "400", description = "요청 파라미터 오류"),
            @ApiResponse(responseCode = "404", description = "주소를 찾을 수 없음"),
            @ApiResponse(responseCode = "500", description = "서버 내부 오류")
    })
    @GetMapping("/address/jibun")
    public ResponseEntity<DefaultApiResponse<?>> getJibunSearchInfo(
            @RequestParam String keyword, @RequestParam(defaultValue = "0") Integer page, @RequestParam(defaultValue = "10") Integer size) {
        logger.info("지번 검색 요청: keyword={}", keyword);

        try {
            List<JibunSearchResultVO> jibunSearchResultVOList = addressService.getJibunSearchInfo(keyword, page, size);
            return ResponseEntity.ok(DefaultApiResponse.success(jibunSearchResultVOList));
        } catch (IllegalArgumentException e){
            return ResponseEntity.badRequest().body(DefaultApiResponse.error(400, e.getMessage(), "INVALID_REQUEST"));
        }

    }
    
}
