package incheon.ags.aip.web;

import incheon.ags.aip.service.AipFlightService;
import incheon.ags.aip.vo.AipFlightVO;
import incheon.com.cmm.api.DefaultApiResponse;
import lombok.RequiredArgsConstructor;
import org.egovframe.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.server.ResponseStatusException;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * @ClassName : AipFlightController.java
 * @Description : 판독 조서 컨트롤러
 *
 * @author : 관리자
 * @since : 2025. 10. 01
 * @version : 1.0
 *
 *          <pre>
 * << 개정이력(Modification Information) >>
 *
 *   수정일              수정자               수정내용
 *  -------------  ------------   ---------------------
 *   2023. 10. 10    관리자               최초 생성
 *   2024. 12. 19    관리자               패널 기반 플랫폼으로 전면 개편
 *   2025. 11. 01    관리자               항공 영상 컨트롤러 전환
 *   2026. 02. 10    관리자               항공 영상 아폴로 제거
 *          </pre>
 *
 */
@Controller
@RequestMapping("/aip/flight")
@RequiredArgsConstructor
public class AipFlightController {
	private static final Logger log = LoggerFactory.getLogger(AipFlightController.class);

	private final AipFlightService aipFlightService;
	
	private String newErrId(){
		return UUID.randomUUID().toString();
	}

	private ResponseStatusException serverError(String op, String errId, RuntimeException e){
		log.error("AipExtracController {} failed. errId={}", op, errId, e);
		return new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, "처리 중 오류가 발생했습니다. errId=" + errId, e);
	}

	private ResponseEntity<DefaultApiResponse<Map<String, Object>>> extracServerError(String op, RuntimeException e){
		String errId = newErrId();
		log.error("AipExtracController {} failed. errId={}", op, errId, e);
		return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
				.body(DefaultApiResponse.error(500, "처리 중 오류가 발생했습니다.", "errId=" + errId));
	}

	private ResponseEntity<DefaultApiResponse<Map<String, Object>>> extracServerError(String op, IOException e){
		String errId = newErrId();
		log.error("AipExtracController {} failed. errId={}", op, errId, e);
		return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
				.body(DefaultApiResponse.error(500, "처리 중 오류가 발생했습니다.", "errId=" + errId));
	}
    /**
     * 항공 영상 리스트 조회
     * @param vo
     * @return JSP
     * @exception Exception
     */
	@PostMapping("/getFlightList.do")
	@ResponseBody
	public Map<String, Object> getFlightList(@RequestParam(defaultValue = "1") int page, @ModelAttribute AipFlightVO vo) throws Exception {
		try{
			PaginationInfo paginationInfo = new PaginationInfo();
			paginationInfo.setCurrentPageNo(page);
			paginationInfo.setRecordCountPerPage(vo.getRecordCountPerPage());
			paginationInfo.setPageSize(vo.getPageSize());

			vo.setFirstIndex(paginationInfo.getFirstRecordIndex());
			vo.setLastIndex(paginationInfo.getLastRecordIndex());
			vo.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
			
			List<Map<String,Object>> flightList = aipFlightService.selectFlightList(vo);
			int totalCount = aipFlightService.countFlightItems(vo);

			Map<String, Object> result = new HashMap<>();
			result.put("flightList", flightList);
			result.put("totalCount", totalCount);
			return result;
		}catch(RuntimeException e){
			String errId = newErrId();
			throw serverError("getExtracList", errId, e);
		}
	}

    /**
     * 항공 영상 비교 팝업
     * @param vo
     * @return JSP
     * @exception Exception
     */
	@GetMapping("/flightPop.do")
	public String flightPop(@RequestParam("gid") String gid, ModelMap model) throws Exception {
		model.addAttribute("gid", gid);
		return "ags/aip/popup/flightPop";
	}
	
	/**
	 * 항공 영상 비교 리스트
	 * @param vo
	 * @return JSP
	 * @exception Exception
	 */
	@PostMapping("/getOvlList.do")
	@ResponseBody
	public Map<String, Object> getOvlList(@RequestParam(defaultValue = "1") int page, @ModelAttribute AipFlightVO vo) throws Exception {
		try{
			PaginationInfo paginationInfo = new PaginationInfo();
			paginationInfo.setCurrentPageNo(page);
			paginationInfo.setRecordCountPerPage(vo.getRecordCountPerPage());
			paginationInfo.setPageSize(vo.getPageSize());

			vo.setFirstIndex(paginationInfo.getFirstRecordIndex());
			vo.setLastIndex(paginationInfo.getLastRecordIndex());
			vo.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());

			int totalCount = aipFlightService.countOvlCovers(vo);
			List<Map<String,Object>> ovlList = aipFlightService.getOvlCovers(vo);

			Map<String, Object> result = new HashMap<>();
			result.put("ovlList", ovlList);
			result.put("totalCount", totalCount);
			return result;
		}catch(RuntimeException e){
			String errId = newErrId();
			throw serverError("getExtracList", errId, e);
		}
	}

}