package incheon.ags.ias.srvy.srvyRspns.web;

import incheon.ags.ias.srvy.srvyRspns.service.SrvyRspnsService;
import incheon.ags.ias.srvy.srvyRspns.vo.SrvyRspnsVO;
import incheon.ags.ias.srvy.srvyRspns.web.dto.SrvyRspnsRequestDTO;
import incheon.com.cmm.context.RequestContext;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * 설문 응답 REST API Controller
 * - 설문 응답 정보 관리 REST API
 */
@RestController
@RequiredArgsConstructor
@Slf4j
public class SrvyRspnsApiController {
    
    private final SrvyRspnsService srvyRspnsService;

    /**
     * 설문 응답 등록
     */
    @PostMapping("/ags/ias/srvyRspns/srvyRspnsRegistAction.do")
    @ResponseBody
    public Map<String, Object> srvyRspnsRegistAction(
            @ModelAttribute SrvyRspnsRequestDTO srvyRspnsRequestDTO,
            HttpServletRequest request) throws Exception {

        Map<String, Object> response = new HashMap<>();

        try {
            log.info("설문 응답 등록 요청: {}", srvyRspnsRequestDTO.toString());

            // 현재 접속한 사용자 ID 설정
            String loginUserId = RequestContext.getCurrentUserId();


            SrvyRspnsVO srvyRspnsVO = srvyRspnsRequestDTO.toEntity();
            srvyRspnsVO.setSrvyRspnsCrtUserId(loginUserId);
            srvyRspnsVO.setSrvyRspnsChgUserId(loginUserId);

            int result = srvyRspnsService.insertSrvyRspns(srvyRspnsVO);

            if (result > 0) {
                log.info("설문 응답 등록 성공 - 설문 응답번호: {}", srvyRspnsVO.getRspnsSn());
                response.put("success", true);
                response.put("message", "설문 응답이 성공적으로 등록되었습니다.");
                response.put("srvyRspnsSn", srvyRspnsVO.getRspnsSn());
            } else {
                log.error("설문 응답 등록 실패 - 설문 응답번호: {}", srvyRspnsVO.getRspnsSn());
                response.put("success", false);
                response.put("message", "설문 응답 등록에 실패했습니다.");
                response.put("errorCode", "INSERT_FAILED");
            }

        } catch (Exception e) {
            log.error("설문 응답 등록 중 오류 발생", e);
            response.put("success", false);
            response.put("message", "설문 응답 등록 중 오류가 발생했습니다: " + e.getMessage());
            response.put("errorCode", "INTERNAL_ERROR");
        }

        return response;
    }

    /**
     * 설문 응답 수정
     */
    @PutMapping("/ags/ias/srvyRspns/srvyRspnsModifyAction.do/{srvyRspnsSn}")
    @ResponseBody
    public Map<String, Object> srvyRspnsModifyAction(
            @PathVariable("srvyRspnsSn") String srvyRspnsSn,
            @ModelAttribute SrvyRspnsRequestDTO srvyRspnsRequestDTO,
            HttpServletRequest request) throws Exception {

        Map<String, Object> response = new HashMap<>();

        try {
            log.info("설문 응답 수정 요청 - 설문 응답번호: {}, 데이터: {}", srvyRspnsSn, srvyRspnsRequestDTO.toString());

            if (srvyRspnsSn == null || srvyRspnsSn.trim().isEmpty()) {
                response.put("success", false);
                response.put("message", "수정할 설문 응답 번호가 없습니다.");
                response.put("errorCode", "MISSING_SRVY_RSPNS_SN");
                return response;
            }

            // 현재 접속한 사용자 ID 설정
            String loginUserId = RequestContext.getCurrentUserId();


            // 설문 응답 존재 여부 확인
            SrvyRspnsVO checkRspns = new SrvyRspnsVO();
            checkRspns.setRspnsSn(Integer.parseInt(srvyRspnsSn));
            SrvyRspnsVO foundRspns = srvyRspnsService.selectSrvyRspnsDetail(checkRspns);

            if (foundRspns == null) {
                response.put("success", false);
                response.put("message", "수정할 설문 응답을 찾을 수 없습니다.");
                response.put("errorCode", "SRVY_RSPNS_NOT_FOUND");
                return response;
            }

            SrvyRspnsVO srvyRspnsVO = srvyRspnsRequestDTO.toEntity();
            srvyRspnsVO.setRspnsSn(Integer.parseInt(srvyRspnsSn));
            srvyRspnsVO.setSrvyRspnsChgUserId(loginUserId);

            int result = srvyRspnsService.updateSrvyRspns(srvyRspnsVO);

            if (result > 0) {
                log.info("설문 응답 수정 성공 - 설문 응답번호: {}", srvyRspnsSn);
                response.put("success", true);
                response.put("message", "설문 응답이 성공적으로 수정되었습니다.");
                response.put("srvyRspnsSn", srvyRspnsSn);
            } else {
                log.error("설문 응답 수정 실패 - 설문 응답번호: {}", srvyRspnsSn);
                response.put("success", false);
                response.put("message", "설문 응답 수정에 실패했습니다.");
                response.put("errorCode", "UPDATE_FAILED");
            }

        } catch (Exception e) {
            log.error("설문 응답 수정 중 오류 발생", e);
            response.put("success", false);
            response.put("message", "설문 응답 수정 중 오류가 발생했습니다: " + e.getMessage());
            response.put("errorCode", "INTERNAL_ERROR");
        }

        return response;
    }

    /**
     * 설문 응답 삭제
     */
    @DeleteMapping("/ags/ias/srvyRspns/srvyRspnsDeleteAction.do/{srvyRspnsSn}")
    @ResponseBody
    public Map<String, Object> srvyRspnsDeleteAction(
            @PathVariable("srvyRspnsSn") String srvyRspnsSn) throws Exception {

        Map<String, Object> response = new HashMap<>();

        try {
            log.info("설문 응답 삭제 요청 - 설문 응답번호: {}", srvyRspnsSn);

            if (srvyRspnsSn == null || srvyRspnsSn.trim().isEmpty()) {
                response.put("success", false);
                response.put("message", "삭제할 설문 응답 번호가 없습니다.");
                response.put("errorCode", "MISSING_SRVY_RSPNS_SN");
                return response;
            }

            // 설문 응답 존재 여부 확인
            SrvyRspnsVO checkRspns = new SrvyRspnsVO();
            checkRspns.setRspnsSn(Integer.parseInt(srvyRspnsSn));
            SrvyRspnsVO foundRspns = srvyRspnsService.selectSrvyRspnsDetail(checkRspns);

            if (foundRspns == null) {
                response.put("success", false);
                response.put("message", "삭제할 설문 응답을 찾을 수 없습니다.");
                response.put("errorCode", "SRVY_RSPNS_NOT_FOUND");
                return response;
            }

            SrvyRspnsVO deleteRspns = new SrvyRspnsVO();
            deleteRspns.setRspnsSn(Integer.parseInt(srvyRspnsSn));
            int result = srvyRspnsService.deleteSrvyRspns(deleteRspns);

            if (result > 0) {
                log.info("설문 응답 삭제 성공 - 설문 응답번호: {}", srvyRspnsSn);
                response.put("success", true);
                response.put("message", "설문 응답이 성공적으로 삭제되었습니다.");
                response.put("deletedSrvyRspnsSn", srvyRspnsSn);
            } else {
                log.error("설문 응답 삭제 실패 - 설문 응답번호: {}", srvyRspnsSn);
                response.put("success", false);
                response.put("message", "설문 응답 삭제에 실패했습니다.");
                response.put("errorCode", "DELETE_FAILED");
            }

        } catch (Exception e) {
            log.error("설문 응답 삭제 중 오류 발생", e);
            response.put("success", false);
            response.put("message", "설문 응답 삭제 중 오류가 발생했습니다: " + e.getMessage());
            response.put("errorCode", "INTERNAL_ERROR");
        }

        return response;
    }
}
