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

import incheon.ags.ias.srvy.srvyRspdnt.service.SrvyRspdntService;
import incheon.ags.ias.srvy.srvyRspdnt.vo.SrvyRspdntSearchVO;
import incheon.ags.ias.srvy.srvyRspdnt.vo.SrvyRspdntVO;
import incheon.ags.ias.srvy.srvyRspdnt.web.dto.SrvyRspdntRequestDTO;
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/srvyRspdnt
 */
@Tag(name = "설문 응답자 API", description = "설문 응답자 관리 API")
@Slf4j
@RestController
@RequestMapping("/api/v1/ags/srvyRspdnt")
@RequiredArgsConstructor
@Validated
public class SrvyRspdntApiController {
    
    private final SrvyRspdntService srvyRspdntService;

    /* ========================================
     * 설문 응답자 관련 API
     * ======================================== */

    /**
     * 1.0 설문 응답자 목록 조회
     * GET /api/v1/srvyRspdnt/list
     */
    @Operation(summary = "설문 응답자 목록 조회", description = "전체 설문 응답자 목록을 조회합니다")
    @GetMapping("/list")
    public ResponseEntity<DefaultApiResponse<List<SrvyRspdntVO>>> getSrvyRspdntList() throws Exception {
        SrvyRspdntSearchVO searchVO = new SrvyRspdntSearchVO();
        searchVO.setRecordCountPerPage(1000); // 전체 조회
        searchVO.setFirstIndex(0);

        List<SrvyRspdntVO> result = srvyRspdntService.selectSrvyRspdntList(searchVO);
        return ResponseEntity.ok(DefaultApiResponse.success(result, "설문 응답자 목록을 조회했습니다."));
    }

    /**
     * 1.1 설문 응답자 단건 조회
     * GET /api/v1/srvyRspdnt/{srvyRspdntSn}
     */
    @Operation(summary = "설문 응답자 단건 조회", description = "특정 설문 응답자의 상세 정보를 조회합니다")
    @GetMapping("/{srvyRspdntSn}")
    public ResponseEntity<DefaultApiResponse<SrvyRspdntVO>> getSrvyRspdntDetail(
            @Parameter(description = "설문 응답자번호", required = true, example = "1")
            @PathVariable String srvyRspdntSn) throws Exception {

        SrvyRspdntVO vo = new SrvyRspdntVO();
        vo.setSrvyRspdntSn(Integer.parseInt(srvyRspdntSn));
        SrvyRspdntVO result = srvyRspdntService.selectSrvyRspdntDetail(vo);
        
        if (result == null) {
            throw new EntityNotFoundException("설문 응답자");
        }

        return ResponseEntity.ok(DefaultApiResponse.success(result, "설문 응답자 상세 정보를 조회했습니다."));
    }

    /**
     * 1.2 설문 응답자 등록
     * POST /api/v1/srvyRspdnt
     */
    @Operation(summary = "설문 응답자 등록", description = "새로운 설문 응답자를 등록합니다")
    @PostMapping
    public ResponseEntity<DefaultApiResponse<Object>> insertSrvyRspdnt(
            @Valid @RequestBody SrvyRspdntRequestDTO dto) throws Exception {

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


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

        srvyRspdntService.insertSrvyRspdnt(vo);
        return ResponseEntity.ok(DefaultApiResponse.success(vo.getSrvyRspdntSn(), "설문 응답자가 등록되었습니다."));
    }

    /**
     * 1.3 설문 응답자 수정
     * PUT /api/v1/srvyRspdnt/{srvyRspdntSn}
     */
    @Operation(summary = "설문 응답자 수정", description = "설문 응답자 정보를 수정합니다")
    @PutMapping("/{srvyRspdntSn}")
    public ResponseEntity<DefaultApiResponse<Object>> updateSrvyRspdnt(
            @Parameter(description = "설문 응답자번호", required = true, example = "1")
            @PathVariable String srvyRspdntSn,
            @Valid @RequestBody SrvyRspdntRequestDTO dto) throws Exception {

        // 존재 여부 확인
        SrvyRspdntVO vo = new SrvyRspdntVO();
        vo.setSrvyRspdntSn(Integer.parseInt(srvyRspdntSn));
        SrvyRspdntVO existingRspdnt = srvyRspdntService.selectSrvyRspdntDetail(vo);
        if (existingRspdnt == null) {
            throw new EntityNotFoundException("설문 응답자");
        }

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


        // 수정
        SrvyRspdntVO updateVO = dto.toEntity();
        updateVO.setSrvyRspdntSn(Integer.parseInt(srvyRspdntSn));
        updateVO.setLastMdfcnId(loginUserId);
        srvyRspdntService.updateSrvyRspdnt(updateVO);

        return ResponseEntity.ok(DefaultApiResponse.success(null, "설문 응답자가 수정되었습니다."));
    }

    /**
     * 1.4 설문 응답자 삭제
     * DELETE /api/v1/srvyRspdnt/{srvyRspdntSn}
     */
    @Operation(summary = "설문 응답자 삭제", description = "설문 응답자를 삭제합니다")
    @DeleteMapping("/{srvyRspdntSn}")
    public ResponseEntity<DefaultApiResponse<Object>> deleteSrvyRspdnt(
            @Parameter(description = "설문 응답자번호", required = true, example = "1")
            @PathVariable String srvyRspdntSn) throws Exception {

        // 존재 여부 확인
        SrvyRspdntVO vo = new SrvyRspdntVO();
        vo.setSrvyRspdntSn(Integer.parseInt(srvyRspdntSn));
        SrvyRspdntVO existingRspdnt = srvyRspdntService.selectSrvyRspdntDetail(vo);
        if (existingRspdnt == null) {
            throw new EntityNotFoundException("설문 응답자");
        }

        srvyRspdntService.deleteSrvyRspdnt(vo);
        return ResponseEntity.ok(DefaultApiResponse.success(null, "설문 응답자가 삭제되었습니다."));
    }
}