package incheon.sgp.ipd.transport.web;

import incheon.com.cmm.api.DefaultApiResponse;
import incheon.sgp.ipd.transport.service.TransportationService;
import incheon.sgp.ipd.transport.vo.BusVO;
import incheon.sgp.ipd.transport.vo.SubwayShapeVO;
import incheon.sgp.ipd.transport.vo.SubwayVO;
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.ApiResponses;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;

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

@RestController
@RequiredArgsConstructor
@Slf4j
@RequestMapping("/sgp/ipd/transport")
public class TransportationApiController {

    private final TransportationService transportationService;

    @Operation(summary = "버스 정보 조회", description = "반경 검색에 따른 버스 데이터 반환")
    @ApiResponses(value = {
            @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "데이터 요청 성공",
                    content = @Content(schema = @Schema(implementation = DefaultApiResponse.class))),
            @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "요청 파라미터 오류"),
            @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 내부 오류")
    })
    @GetMapping("/getBus")
    public ResponseEntity<DefaultApiResponse<List<BusVO>>> getBusByRadius(
            @RequestParam(defaultValue = "37.455949") double latitude,
            @RequestParam(defaultValue = "126.705066") double longitude,
            @RequestParam(defaultValue = "500") double radius,
            @RequestParam(defaultValue = "0") int offset,
            @RequestParam(defaultValue = "5") int limit,
            ModelMap model
    ) {
        List<BusVO> resultList = transportationService.getBusByRadius(latitude, longitude, radius, offset, limit);
        return ResponseEntity.ok(DefaultApiResponse.success(resultList));
    }

    @Operation(summary = "버스 정보 찾기", description = "위치,이름을 통한 버스 데이터 반환")
    @ApiResponses(value = {
            @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "데이터 요청 성공",
                    content = @Content(schema = @Schema(implementation = DefaultApiResponse.class))),
            @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "요청 파라미터 오류"),
            @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 내부 오류")
    })
    @GetMapping("/findBus")
    public ResponseEntity<DefaultApiResponse<BusVO>> findBusByRadius(
            @RequestParam double latitude,
            @RequestParam double longitude,
            @RequestParam String name
    ) {
        BusVO bus = transportationService.findBusByRadius(latitude, longitude, name);
        return ResponseEntity.ok(DefaultApiResponse.success(bus));
    }
    
    @Operation(summary = "지하철 정보 조회", description = "반경 검색에 따른 지하철 데이터 반환")
    @ApiResponses(value = {
            @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "데이터 요청 성공",
                    content = @Content(schema = @Schema(implementation = DefaultApiResponse.class))),
            @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "요청 파라미터 오류"),
            @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 내부 오류")
    })
    @GetMapping("/getSubway")
    public ResponseEntity<DefaultApiResponse<List<SubwayVO>>> getSubwayByRadius(
            @RequestParam(defaultValue = "37.455949") double latitude,
            @RequestParam(defaultValue = "126.705066") double longitude,
            @RequestParam(defaultValue = "500") double radius,
            @RequestParam(defaultValue = "0") int offset,
            @RequestParam(defaultValue = "5") int limit,
            ModelMap model
    ) {
        List<SubwayVO> resultList = transportationService.getSubwayByRadius(latitude, longitude, radius, offset, limit);
        return ResponseEntity.ok(DefaultApiResponse.success(resultList));
    }

    @GetMapping("/getSubwayStPolyGonRadius")
    public ResponseEntity<DefaultApiResponse<List<SubwayShapeVO>>> getSubwayStPolyGonRadius(
    		@RequestParam(defaultValue = "37.455949") double latitude,
    		@RequestParam(defaultValue = "126.705066") double longitude,
    		@RequestParam(defaultValue = "500") double radius,
    		@RequestParam(defaultValue = "0") int offset,
    		@RequestParam(defaultValue = "5") int limit,
    		ModelMap model
    		) {
    	List<SubwayShapeVO> resultList = transportationService.getSubwayStPolyGonRadius(latitude, longitude, radius, offset, limit);
    	return ResponseEntity.ok(DefaultApiResponse.success(resultList));
    }

    @GetMapping("/getSubwayLine")
    public ResponseEntity<DefaultApiResponse<List<SubwayShapeVO>>> getSubwayLine(
    		@RequestParam(defaultValue = "37.455949") double latitude,
    		@RequestParam(defaultValue = "126.705066") double longitude,
    		@RequestParam(defaultValue = "500") double radius,
    		@RequestParam(defaultValue = "0") int offset,
    		@RequestParam(defaultValue = "5") int limit,
    		ModelMap model
    		) {
    	List<SubwayShapeVO> resultList = transportationService.getSubwayLine(latitude, longitude, radius, offset, limit);
    	return ResponseEntity.ok(DefaultApiResponse.success(resultList));
    }

    @GetMapping("/getSubwaySt")
    public ResponseEntity<DefaultApiResponse<List<SubwayVO>>> getSubwaySt(
    		@RequestParam(defaultValue = "37.455949") double latitude,
    		@RequestParam(defaultValue = "126.705066") double longitude,
    		@RequestParam(defaultValue = "500") double radius,
    		@RequestParam(defaultValue = "0") int offset,
    		@RequestParam(defaultValue = "5") int limit,
    		ModelMap model
    		) {
    	List<SubwayVO> resultList = transportationService.getSubwaySt(latitude, longitude, radius, offset, limit);
    	return ResponseEntity.ok(DefaultApiResponse.success(resultList));
    }

    @GetMapping("/getSubwayExit")
    public ResponseEntity<DefaultApiResponse<List<SubwayVO>>> getSubwayExit(
    		@RequestParam(defaultValue = "37.455949") double latitude,
    		@RequestParam(defaultValue = "126.705066") double longitude,
    		@RequestParam(defaultValue = "500") double radius,
    		@RequestParam(defaultValue = "0") int offset,
    		@RequestParam(defaultValue = "5") int limit,
    		ModelMap model
    		) {
    	List<SubwayVO> resultList = transportationService.getSubwayExit(latitude, longitude, radius, offset, limit);
    	return ResponseEntity.ok(DefaultApiResponse.success(resultList));
    }

    @Operation(summary = "버스 도착 정보 조회",
            description = "정류소(bstopId) 기준 도착 정보를 조회합니다.")
    @ApiResponses(value = {
            @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "데이터 요청 성공"),
            @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "요청 파라미터 오류"),
            @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 내부 오류")
    })
    @GetMapping("/api/v1/bus")
    public ResponseEntity<List<Map<String, Object>>> getBusArrival(
            @RequestParam String bstopId,
            @RequestParam(defaultValue = "1") Integer pageNo,
            @RequestParam(defaultValue = "10") Integer numOfRows
    ) {
        //log.info("[GET] /sgp/ipd/transport/api/v1/bus bstopId={}, pageNo={}, numOfRows={}",
        //        bstopId, pageNo, numOfRows);

        List<Map<String, Object>> result = transportationService.getBusArrival(bstopId, pageNo, numOfRows);

        if (result != null && !result.isEmpty()) {
            //log.info("[busArrival] rows={}", result.size());
            //log.info("[busArrival] result={}", result.get(0));
        } else {
            //log.info("[busArrival] empty result");
        }

        return ResponseEntity.ok(result);
    }
    
    @Operation(summary = "버스 노선 정보 조회",
            description = "정류소(bstopId) 기준 도착 정보를 조회합니다.")
    @ApiResponses(value = {
            @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "데이터 요청 성공"),
            @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "요청 파라미터 오류"),
            @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 내부 오류")
    })
    @GetMapping("/api/v1/bus/route")
    public ResponseEntity<String> getBusRoute(
            @RequestParam String routeId,
            @RequestParam(defaultValue = "1") Integer pageNo,
            @RequestParam(defaultValue = "10") Integer numOfRows
    ) {
        //log.info("[GET] /sgp/ipd/transport/api/v1/bus/route bstopId={}, pageNo={}, numOfRows={}",
        //		routeId, pageNo, numOfRows);

        String result = transportationService.getBusRoute(routeId, pageNo, numOfRows);

        if (result != null && !result.isEmpty()) {
            //log.info("[getBusRoute] rows={}", result);
            //log.info("[getBusRoute] result={}", result);
        } else {
            //log.info("[getBusRoute] empty result");
        }

        return ResponseEntity.ok(result);
    }
}