package com.dbnt.kcscbackend.admin.committee.schedules.controller;



import com.dbnt.kcscbackend.admin.committee.schedules.model.CreateScheduleVO;
import com.dbnt.kcscbackend.admin.committee.schedules.model.UpdateScheduleVO;
import com.dbnt.kcscbackend.admin.committee.schedules.service.EgovIndvdlSchdulManageService;
import com.dbnt.kcscbackend.auth.entity.LoginVO;
import com.dbnt.kcscbackend.config.common.ResponseCode;
import com.dbnt.kcscbackend.config.common.ResultVO;
import io.swagger.annotations.Api;
import io.swagger.v3.oas.annotations.Operation;
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 org.springframework.http.MediaType;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.*;


@Api("SchedulesApiController")
@RestController
@Tag(name="SchedulesApiController",description = "일정 관리")
public class SchedulesApiController {


	@Resource(name = "egovIndvdlSchdulManageService")
	private EgovIndvdlSchdulManageService egovIndvdlSchdulManageService;

	@Operation(
			summary = "'위원회 일정 등록' 페이지 로딩 시, 필요한 데이터 불러 오는 API",
			description = "관리자 단에서 '위원회 관리' > '위원회 일정 관리'에 '등록' 버튼을 누른 후 '위원회 일정 등록' 페이지 로딩 시, 필요한 데이터 불러 오는 API",
			tags = {"SchedulesApiController"}
	)
	@ApiResponses(value = {
			@ApiResponse(responseCode = "200", description = "조회 성공"),
			@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
	})
	@GetMapping(value = "/schedule/init")
	public ResultVO scheduleInit(@RequestParam Map<String, Object> commandMap) throws Exception {
		ResultVO resultVO = new ResultVO();
		return egovIndvdlSchdulManageService.scheduleInit(resultVO);
	}


	@Operation(
			summary = "'위원회 일정 등록' 페이지에서 심의위원회 첫 번째 거 선택 시, 하위 목록 불러오는 API",
			description = "관리자 단에서 '위원회 관리' > '위원회 일정 관리'에 '등록' 버튼을 누른 후 '위원회 일정 등록' 페이지에서 심의위원회 첫 번째 거 선택 시, 하위 목록 불러오는 API",
			tags = {"SchedulesApiController"}
	)
	@ApiResponses(value = {
			@ApiResponse(responseCode = "200", description = "조회 성공"),
			@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
	})
	@GetMapping(value = "/schedule/api/org-api/depth/list")
	public ResultVO scheduleApiOrgApiDepthList(@RequestParam Long paramCodeGroup) throws Exception {
		ResultVO resultVO = new ResultVO();
		return egovIndvdlSchdulManageService.scheduleApiOrgApiDepthList(resultVO, paramCodeGroup);
	}

	@Operation(
			summary = "'위원회 일정 등록' 페이지에서 일정 등록하는 API",
			description = "관리자 단에서 '위원회 관리' > '위원회 일정 관리'에 '등록' 버튼을 누른 후 '위원회 일정 등록' 페이지에서 일정 등록하는 API",
			tags = {"SchedulesApiController"}
	)
	@ApiResponses(value = {
			@ApiResponse(responseCode = "200", description = "등록 성공"),
			@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
	})
	@PostMapping(value = "/schedule")
	public ResultVO createSchedule(HttpServletRequest request, CreateScheduleVO createScheduleVO) throws Exception {

		ResultVO resultVO = new ResultVO();

		try {
			resultVO = egovIndvdlSchdulManageService.createSchedule(resultVO, request, createScheduleVO);
		} catch (Exception e) {
			resultVO.setResultCode(ResponseCode.FAILED.getCode());
			resultVO.setResultMessage(e.getMessage());
		}


		System.out.println(
				"\n--------------------------------------------------------------\n" +
				request.getRequestURI() + " OUT:" +
				"\n--------------------------------------------------------------\n" +
				"resultVO.toString():" + "\n" +
				resultVO.toString() + "\n" +
				"\n--------------------------------------------------------------\n"
		);

		return resultVO;
	}

	@Operation(
			summary = "'위원회 일정 등록' 페이지에서 일정 수정하는 API",
			description = "관리자 단에서 '위원회 관리' > '위원회 일정 관리'에 특정 일정을 누른 후, '수정' > '저장' 버튼을 누르면 해당 일정을 수정하는 API",
			tags = {"SchedulesApiController"}
	)
	@ApiResponses(value = {
			@ApiResponse(responseCode = "200", description = "등록 성공"),
			@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
	})
	@PutMapping(value = "/schedule/{scheduleId}")
	public ResultVO updateSchedule
	(
		@AuthenticationPrincipal LoginVO user,
		HttpServletRequest request,
		UpdateScheduleVO updateScheduleVO,
		@PathVariable("scheduleId") Long scheduleId
	) throws Exception {

		ResultVO resultVO = new ResultVO();

		try {
			resultVO = egovIndvdlSchdulManageService.updateSchedule(resultVO, request, updateScheduleVO);
		} catch (Exception e) {
			resultVO.setResultCode(ResponseCode.FAILED.getCode());
			resultVO.setResultMessage(e.getMessage());
		}


		System.out.println(
				"\n--------------------------------------------------------------\n" +
						request.getRequestURI() + " OUT:" +
						"\n--------------------------------------------------------------\n" +
						"resultVO.toString():" + "\n" +
						resultVO.toString() + "\n" +
						"\n--------------------------------------------------------------\n"
		);

		return resultVO;
	}


	@Operation(
			summary = "'위원회 일정 등록' 페이지에서 일정 삭제하는 API",
			description = "관리자 단에서 '위원회 관리' > '위원회 일정 관리'에서 특정 일정을 삭제하는 API",
			tags = {"SchedulesApiController"}
	)
	@ApiResponses(value = {
			@ApiResponse(responseCode = "200", description = "등록 성공"),
			@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
	})
	@DeleteMapping(value = "/schedule/{scheduleId}")
	public ResultVO deleteSchedule
	(
			@AuthenticationPrincipal LoginVO user,
			HttpServletRequest request,
			@PathVariable("scheduleId") String strSchdulId
	) throws Exception {

		ResultVO resultVO = new ResultVO();
		Long schdulId = Long.valueOf(strSchdulId);
		try {
			resultVO = egovIndvdlSchdulManageService.deleteSchedule(resultVO, request, schdulId);
		} catch (Exception e) {
			resultVO.setResultCode(ResponseCode.FAILED.getCode());
			resultVO.setResultMessage(e.getMessage());
		}


		System.out.println(
				"\n--------------------------------------------------------------\n" +
						request.getRequestURI() + " OUT:" +
						"\n--------------------------------------------------------------\n" +
						"resultVO.toString():" + "\n" +
						resultVO.toString() + "\n" +
						"\n--------------------------------------------------------------\n"
		);

		return resultVO;
	}


	@Operation(
			summary = "일정 상세조회",
			description = "일정 목록을 상세조회",
			tags = {"SchedulesApiController"}
	)
	@ApiResponses(value = {
			@ApiResponse(responseCode = "200", description = "조회 성공")
	})
	@GetMapping(value = "/schedule/{scheduleId}")
	public ResultVO scheduleDetail(
			HttpServletRequest request,
			@AuthenticationPrincipal LoginVO user,
			@PathVariable("scheduleId") Long scheduleId
	)
			throws Exception {

		ResultVO resultVO = new ResultVO();

		try {
			resultVO = egovIndvdlSchdulManageService.scheduleDetail(resultVO, request, user, scheduleId);
		} catch (Exception e) {
			resultVO.setResultCode(ResponseCode.FAILED.getCode());
			resultVO.setResultMessage(e.getMessage());
		}


		System.out.println(
				"\n--------------------------------------------------------------\n" +
						request.getRequestURI() + " OUT:" +
						"\n--------------------------------------------------------------\n" +
						"resultVO.toString():" + "\n" +
						resultVO.toString() + "\n" +
						"\n--------------------------------------------------------------\n"
		);

		return resultVO;
	}



	/**
	 * 일정(월별) 목록을 조회한다.
	 * @param request
	 * @param commandMap
	 * @return resultVO
	 * @throws Exception
	 */
	@Operation(
			summary = "월별 일정 조회",
			description = "일정(월별) 목록을 조회",
			tags = {"EgovIndvdlSchdulManageApiController"}
	)
	@ApiResponses(value = {
			@ApiResponse(responseCode = "200", description = "조회 성공"),
			@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
	})
	@GetMapping(value = "/schedule/month")
	public ResultVO scheduleMonth(@AuthenticationPrincipal LoginVO user,
								  HttpServletRequest request,
								  @RequestParam Map<String, Object> commandMap) throws Exception {


		ResultVO resultVO = new ResultVO();

		try {
			resultVO = egovIndvdlSchdulManageService.scheduleMonth(resultVO, request, user, commandMap);
		} catch (Exception e) {
			resultVO.setResultCode(ResponseCode.FAILED.getCode());
			resultVO.setResultMessage(e.getMessage());
		}


		System.out.println(
				"\n--------------------------------------------------------------\n" +
						request.getRequestURI() + " OUT:" +
						"\n--------------------------------------------------------------\n" +
						"resultVO.toString():" + "\n" +
						resultVO.toString() + "\n" +
						"\n--------------------------------------------------------------\n"
		);

		return resultVO;

	}




}