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

import incheon.ags.ias.srvy.srvyQitem.service.SrvyQitemService;
import incheon.ags.ias.srvy.srvyQitem.vo.SrvyQitemVO;
import incheon.ags.ias.srvy.srvyQitemArtcl.service.SrvyQitemArtclService;
import incheon.ags.ias.srvy.srvyQitemArtcl.vo.SrvyQitemArtclSearchVO;
import incheon.ags.ias.srvy.srvyQitemArtcl.vo.SrvyQitemArtclVO;
import incheon.ags.ias.srvy.srvyQitemArtcl.web.dto.SrvyQitemArtclRequestDTO;
import incheon.com.cmm.api.DefaultApiResponse;
import incheon.com.cmm.context.RequestContext;
import incheon.com.cmm.exception.EntityNotFoundException;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

/**
 * 설문조사 문항 선택지 REST API Controller
 * Base URL: /api/v1/srvyQitemArtcl
 */
@Tag(name = "설문조사 문항 선택지 API", description = "설문조사 문항 선택지 관리 API")
@Slf4j
@RestController
@RequestMapping("/api/v1/ags/srvyQitemArtcl")
@RequiredArgsConstructor
@Validated
public class SrvyQitemArtclApiController {
    
    private final SrvyQitemArtclService srvyQitemArtclService;
    private final SrvyQitemService srvyQitemService;

    /**
     * 1.0 설문조사 문항 선택지 목록 조회
     * GET /api/v1/srvyQitemArtcl/list
     */
    @Operation(summary = "설문조사 문항 선택지 목록 조회", description = "전체 설문조사 문항 선택지 목록을 조회합니다")
    @GetMapping("/list")
    public ResponseEntity<List<SrvyQitemArtclVO>> getSrvyQitemArtclList(
            @Parameter(description = "문항 순번 (선택)", example = "1")
            @RequestParam(required = false) Integer qitemSn) throws Exception {
        SrvyQitemArtclSearchVO searchVO = new SrvyQitemArtclSearchVO();
        searchVO.setRecordCountPerPage(1000); // 전체 조회
        searchVO.setFirstIndex(0);
        if (qitemSn != null) {
            searchVO.setQitemSn(qitemSn);
        }

        List<SrvyQitemArtclVO> result = srvyQitemArtclService.selectSrvyQitemArtclList(searchVO);
        return ResponseEntity.ok(result);
    }

    /**
     * 1.1 설문조사 문항 선택지 단건 조회
     * GET /api/v1/srvyQitemArtcl/{srvyQitemArtclSn}
     */
    @Operation(summary = "설문조사 문항 선택지 단건 조회", description = "특정 설문조사 문항 선택지의 상세 정보를 조회합니다")
    @GetMapping("/{srvyQitemArtclSn}")
    public ResponseEntity<SrvyQitemArtclVO> getSrvyQitemArtclDetail(
            @Parameter(description = "설문조사 문항 선택지번호", required = true, example = "1")
            @PathVariable String srvyQitemArtclSn) throws Exception {

        SrvyQitemArtclVO vo = new SrvyQitemArtclVO();
        vo.setArtclSn(Integer.parseInt(srvyQitemArtclSn));
        SrvyQitemArtclVO result = srvyQitemArtclService.selectSrvyQitemArtclDetail(vo);
        
        if (result == null) {
            throw new EntityNotFoundException("설문조사 문항 선택지");
        }

        return ResponseEntity.ok(result);
    }

    /**
     * 1.2 설문조사 문항 선택지 등록
     * POST /api/v1/srvyQitemArtcl
     */
    @Operation(summary = "설문조사 문항 선택지 등록", description = "새로운 설문조사 문항 선택지를 등록합니다")
    @PostMapping
    public ResponseEntity<DefaultApiResponse<Object>> insertSrvyQitemArtcl(
            @Valid @RequestBody SrvyQitemArtclRequestDTO dto) throws Exception {

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


        SrvyQitemArtclVO vo = dto.toEntity();
        vo.setFrstRegId(loginUserId);
        vo.setLastMdfcnId(loginUserId);

        // srvyQitemSn을 통해 srvySn 자동 설정
        if (vo.getQitemSn() != null) {
            try {
                SrvyQitemVO qitemVO = new SrvyQitemVO();
                qitemVO.setQitemSn(vo.getQitemSn());
                SrvyQitemVO qitemDetail = srvyQitemService.selectSrvyQitemDetail(qitemVO);
                if (qitemDetail != null) {
                    vo.setSrvySn(qitemDetail.getSrvySn());
                }
            } catch (Exception e) {
                log.warn("문항 정보 조회 실패, srvySn 설정 불가: {}", e.getMessage());
            }
        }

        srvyQitemArtclService.insertSrvyQitemArtcl(vo);
        return ResponseEntity.ok(DefaultApiResponse.success(null, "설문조사 문항 선택지가 등록되었습니다."));
    }

    /**
     * 1.3 설문조사 문항 선택지 수정
     * PUT /api/v1/srvyQitemArtcl/{srvyQitemArtclSn}
     */
    @Operation(summary = "설문조사 문항 선택지 수정", description = "기존 설문조사 문항 선택지를 수정합니다")
    @PutMapping("/{srvyQitemArtclSn}")
    public ResponseEntity<DefaultApiResponse<Object>> updateSrvyQitemArtcl(
            @Parameter(description = "설문조사 문항 선택지번호", required = true, example = "1")
            @PathVariable String srvyQitemArtclSn,
            @Valid @RequestBody SrvyQitemArtclRequestDTO dto) throws Exception {

        // 존재 여부 확인
        SrvyQitemArtclVO vo = new SrvyQitemArtclVO();
        vo.setArtclSn(Integer.parseInt(srvyQitemArtclSn));
        SrvyQitemArtclVO existingArtcl = srvyQitemArtclService.selectSrvyQitemArtclDetail(vo);
        if (existingArtcl == null) {
            throw new EntityNotFoundException("설문조사 문항 선택지");
        }

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


        // 수정
        SrvyQitemArtclVO updateVO = dto.toEntity();
        updateVO.setArtclSn(Integer.parseInt(srvyQitemArtclSn));
        updateVO.setLastMdfcnId(loginUserId);

        // srvyQitemSn을 통해 srvySn 자동 설정
        if (updateVO.getQitemSn() != null) {
            try {
                SrvyQitemVO qitemVO = new SrvyQitemVO();
                qitemVO.setQitemSn(updateVO.getQitemSn());
                SrvyQitemVO qitemDetail = srvyQitemService.selectSrvyQitemDetail(qitemVO);
                if (qitemDetail != null) {
                    updateVO.setSrvySn(qitemDetail.getSrvySn());
                }
            } catch (Exception e) {
                log.warn("문항 정보 조회 실패, srvySn 설정 불가: {}", e.getMessage());
            }
        }

        srvyQitemArtclService.updateSrvyQitemArtcl(updateVO);

        return ResponseEntity.ok(DefaultApiResponse.success(null, "설문조사 문항 선택지가 수정되었습니다."));
    }

    /**
     * 1.4 설문조사 문항 선택지 삭제
     * DELETE /api/v1/srvyQitemArtcl/{srvyQitemArtclSn}
     */
    @Operation(summary = "설문조사 문항 선택지 삭제", description = "설문조사 문항 선택지를 삭제합니다")
    @DeleteMapping("/{srvyQitemArtclSn}")
    public ResponseEntity<DefaultApiResponse<Object>> deleteSrvyQitemArtcl(
            @Parameter(description = "설문조사 문항 선택지번호", required = true, example = "1")
            @PathVariable String srvyQitemArtclSn) throws Exception {

        // 존재 여부 확인
        SrvyQitemArtclVO vo = new SrvyQitemArtclVO();
        vo.setArtclSn(Integer.parseInt(srvyQitemArtclSn));
        SrvyQitemArtclVO existingArtcl = srvyQitemArtclService.selectSrvyQitemArtclDetail(vo);
        if (existingArtcl == null) {
            throw new EntityNotFoundException("설문조사 문항 선택지");
        }

        srvyQitemArtclService.deleteSrvyQitemArtcl(vo);
        return ResponseEntity.ok(DefaultApiResponse.success(null, "설문조사 문항 선택지가 삭제되었습니다."));
    }

}
