package incheon.sgp.ipd.eduresource.web;

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

import javax.servlet.http.HttpSession;

import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import incheon.ags.ias.authrt.vo.AuthrtVO;
import incheon.com.cmm.api.DefaultApiResponse;
import incheon.sgp.ipd.eduresource.service.EduResouceService;
import incheon.sgp.ipd.eduresource.vo.ChildcareVO;
import incheon.sgp.ipd.eduresource.vo.ElementarySchoolVO;
import incheon.sgp.ipd.eduresource.vo.HighSchoolVO;
import incheon.sgp.ipd.eduresource.vo.KindergartenVO;
import incheon.sgp.ipd.eduresource.vo.SchoolDistrictVO;
import incheon.sgp.ipd.eduresource.vo.SchoolVO;
import incheon.sgp.ipd.eduresource.vo.MiddleSchoolVO;
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 lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@RestController
@RequiredArgsConstructor
@Slf4j
@RequestMapping("/sgp/ipd/eduresource")
public class EduResourceApiController {
	private final EduResouceService eduResourceService;
	
	@Operation(summary = "학교 POI 데이터 조회", description = "반경에 따른 학교 데이터 반환")
    @ApiResponses(value = {
            @ApiResponse(responseCode = "200", description = "데이터 조회 성공",
                    content = @Content(schema = @Schema(implementation = DefaultApiResponse.class))),
            @ApiResponse(responseCode = "400", description = "요청 파라미터 오류"),
            @ApiResponse(responseCode = "500", description = "서버 내부 오류")
    })
    @GetMapping("/getSchool")
    public ResponseEntity<DefaultApiResponse<List<SchoolVO>>> getSchoolByRadius(
    		@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,
			@RequestParam(defaultValue = "1") int page,
            @RequestParam(defaultValue = "") String type,
            HttpSession session,
            ModelMap model
    ) throws Exception {
		if (type.isEmpty()) {
	        List<SchoolVO> resultList = eduResourceService.getSchoolByRadiusAll(latitude,longitude, radius, offset, limit);
	        
	        DefaultApiResponse<List<SchoolVO>> response =
	                DefaultApiResponse.success(resultList);
	        
	        return ResponseEntity.ok(response);
		}
        List<SchoolVO> resultList = eduResourceService.getSchoolByRadius(latitude,longitude, radius, offset, limit,type);

        DefaultApiResponse<List<SchoolVO>> response =
                DefaultApiResponse.success(resultList);
        
        return ResponseEntity.ok(response);
    }
	
    @Operation(summary = "어린이집 POI 데이터 조회", description = "입력한 키워드에 따른 어린이집 데이터 반환")
    @ApiResponses(value = {
    		@ApiResponse(responseCode = "200", description = "데이터 요청 성공", 
    				content = @Content(schema = @Schema(implementation = DefaultApiResponse.class))),
    		@ApiResponse(responseCode = "400", description = "요청 파라미터 오류"),
    		@ApiResponse(responseCode = "500", description = "서버 내부 오류")
    })
    @GetMapping("/getChildcare")
    @ResponseBody
    public ResponseEntity<DefaultApiResponse<List<ChildcareVO>>> getChildCareCenterByRadius(
    		@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,
			@RequestParam(defaultValue = "1") int page,
            ModelMap model
    ) throws Exception{
    	 List<ChildcareVO> resultList = eduResourceService.getChildcareCenterByRadius(latitude,longitude, radius, offset, limit);

         DefaultApiResponse<List<ChildcareVO>> response =
                 DefaultApiResponse.success(resultList);
         
         return ResponseEntity.ok(response);
    }
    
    
    @Operation(summary = "유치원 POI 데이터 조회", description = "입력한 키워드에 따른 유치원 데이터 반환")
    @ApiResponses(value = {
    		@ApiResponse(responseCode = "200", description = "데이터 요청 성공", 
    				content = @Content(schema = @Schema(implementation = DefaultApiResponse.class))),
    		@ApiResponse(responseCode = "400", description = "요청 파라미터 오류"),
    		@ApiResponse(responseCode = "500", description = "서버 내부 오류")
    })
    @GetMapping("/getKindergarten")
    @ResponseBody
    public ResponseEntity<DefaultApiResponse<List<KindergartenVO>>> getKindergartenByRadius(
    		@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,
			@RequestParam(defaultValue = "1") int page,
            ModelMap model
    ) throws Exception{
    	List<KindergartenVO> resultList = eduResourceService.getKindergartenByRadius(latitude,longitude, radius, offset, limit);


        DefaultApiResponse<List<KindergartenVO>> response =
                DefaultApiResponse.success(resultList);
        
        return ResponseEntity.ok(response);
    }
    
    @Operation(summary = "선택한 지점에 대한 중학교 학군 데이터 조회", description = "입력한 키워드에 따른 중학교 학군 데이터 반환")
    @ApiResponses(value = {
    		@ApiResponse(responseCode = "200", description = "데이터 요청 성공", 
    				content = @Content(schema = @Schema(implementation = DefaultApiResponse.class))),
    		@ApiResponse(responseCode = "400", description = "요청 파라미터 오류"),
    		@ApiResponse(responseCode = "500", description = "서버 내부 오류")
    })
    @GetMapping("/getMiddleSchoolDistrictByPoint")
    @ResponseBody
    public ResponseEntity<DefaultApiResponse<SchoolDistrictVO>> getMiddleSchoolDistict(
            @RequestParam(defaultValue = "126.705066") String latitude,
            @RequestParam(defaultValue = "37.455949") String longitude
    		) throws Exception{
    	
    	SchoolDistrictVO resultList = eduResourceService.getMiddleSchoolDistrict(latitude,longitude);

        DefaultApiResponse<SchoolDistrictVO> response =
                DefaultApiResponse.success(resultList);
        
        return ResponseEntity.ok(response);
    	
    }
    
    @GetMapping("/getHighSchoolDistrictByPoint")
    @ResponseBody
    public ResponseEntity<DefaultApiResponse<SchoolDistrictVO>> getHighSchoolDistict(
            @RequestParam(defaultValue = "126.705066") String latitude,
            @RequestParam(defaultValue = "37.455949") String longitude
    		) throws Exception{
		 SchoolDistrictVO resultList = eduResourceService.getHighSchoolDistrict(latitude,longitude);
         
         DefaultApiResponse<SchoolDistrictVO> response =
                 DefaultApiResponse.success(resultList);
         
         return ResponseEntity.ok(response);
    }
    
    @GetMapping("/getElementarySchoolDistrictByPoint")
    @ResponseBody
    public ResponseEntity<DefaultApiResponse<SchoolDistrictVO>> getElementarySchoolDistict(
            @RequestParam(defaultValue = "126.705066") String latitude,
            @RequestParam(defaultValue = "37.455949") String longitude
    		) throws Exception{
    	SchoolDistrictVO resultList = eduResourceService.getElementarySchoolDistrict(latitude,longitude);
        
        DefaultApiResponse<SchoolDistrictVO> response =
                DefaultApiResponse.success(resultList);
        
        return ResponseEntity.ok(response);
    }
    
	@Operation(summary = "학교 POI 찾기", description = "반경에 따른 학교 데이터 반환")
    @ApiResponses(value = {
            @ApiResponse(responseCode = "200", description = "데이터 조회 성공",
                    content = @Content(schema = @Schema(implementation = DefaultApiResponse.class))),
            @ApiResponse(responseCode = "400", description = "요청 파라미터 오류"),
            @ApiResponse(responseCode = "500", description = "서버 내부 오류")
    })
    @GetMapping("/findSchool")
    public ResponseEntity<DefaultApiResponse<SchoolVO>> findSchoolByInfo(
    		@RequestParam double latitude,
		    @RequestParam double longitude,
			@RequestParam String name,
            @RequestParam String type
    ) throws Exception {
        SchoolVO resultList = eduResourceService.findSchoolByInfo(latitude,longitude, name, type);
        
        DefaultApiResponse<SchoolVO> response =
                DefaultApiResponse.success(resultList);
        
        
        return ResponseEntity.ok(response);
    }
	
	@Operation(summary = "어린이집 POI 찾기", description = "반경에 따른 어린이집 데이터 반환")
    @ApiResponses(value = {
            @ApiResponse(responseCode = "200", description = "데이터 조회 성공",
                    content = @Content(schema = @Schema(implementation = DefaultApiResponse.class))),
            @ApiResponse(responseCode = "400", description = "요청 파라미터 오류"),
            @ApiResponse(responseCode = "500", description = "서버 내부 오류")
    })
    @GetMapping("/findChildcare")
    public ResponseEntity<DefaultApiResponse<ChildcareVO>> findChildcareByInfo(
    		@RequestParam double latitude,
		    @RequestParam double longitude,
			@RequestParam String name
    ) throws Exception {
		ChildcareVO resultList = eduResourceService.findChildcareByInfo(latitude,longitude, name);
        
        DefaultApiResponse<ChildcareVO> response =
                DefaultApiResponse.success(resultList);
        
        
        return ResponseEntity.ok(response);
    }
	
	@Operation(summary = "유치원 POI 찾기", description = "반경에 따른 유치원 데이터 반환")
    @ApiResponses(value = {
            @ApiResponse(responseCode = "200", description = "데이터 조회 성공",
                    content = @Content(schema = @Schema(implementation = DefaultApiResponse.class))),
            @ApiResponse(responseCode = "400", description = "요청 파라미터 오류"),
            @ApiResponse(responseCode = "500", description = "서버 내부 오류")
    })
    @GetMapping("/findKindergarten")
    public ResponseEntity<DefaultApiResponse<KindergartenVO>> findKindergartenByInfo(
    		@RequestParam double latitude,
		    @RequestParam double longitude,
			@RequestParam String name
    ) throws Exception {
		KindergartenVO resultList = eduResourceService.findKindergartenByInfo(latitude,longitude, name);
        
        DefaultApiResponse<KindergartenVO> response =
                DefaultApiResponse.success(resultList);
        
        
        return ResponseEntity.ok(response);
    }
	
}
