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

import incheon.ags.ias.srvy.srvyQitem.service.SrvyQitemService;
import incheon.ags.ias.srvy.srvyQitem.vo.SrvyQitemSearchVO;
import incheon.ags.ias.srvy.srvyQitem.vo.SrvyQitemVO;
import incheon.ags.ias.srvy.srvyQitem.web.dto.SrvyQitemRequestDTO;
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/srvyQitem
 */
@Tag(name = "설문 문항 API", description = "설문 문항 관리 API")
@Slf4j
@RestController
@RequestMapping("/api/v1/ags/srvyQitem")
@RequiredArgsConstructor
@Validated
public class SrvyQitemApiController {
    
    private final SrvyQitemService srvyQitemService;

    /**
     * 1.0 설문 문항 목록 조회
     * GET /api/v1/srvyQitem/list
     */
    @Operation(summary = "설문 문항 목록 조회", description = "전체 설문 문항 목록을 조회합니다")
    @GetMapping("/list")
    public ResponseEntity<List<SrvyQitemVO>> getSrvyQitemList() throws Exception {
        SrvyQitemSearchVO searchVO = new SrvyQitemSearchVO();
        searchVO.setRecordCountPerPage(1000); // 전체 조회
        searchVO.setFirstIndex(0);

        List<SrvyQitemVO> result = srvyQitemService.selectSrvyQitemList(searchVO);
        return ResponseEntity.ok(result);
    }

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

        SrvyQitemVO vo = new SrvyQitemVO();
        vo.setQitemSn(Integer.parseInt(srvyQitemSn));
        SrvyQitemVO result = srvyQitemService.selectSrvyQitemDetail(vo);
        
        if (result == null) {
            throw new EntityNotFoundException("설문 문항");
        }

        return ResponseEntity.ok(result);
    }

    /**
     * 1.2 설문 문항 등록
     * POST /api/v1/srvyQitem
     */
    @Operation(summary = "설문 문항 등록", description = "새로운 설문 문항을 등록합니다")
    @PostMapping
    public ResponseEntity<DefaultApiResponse<Object>> insertSrvyQitem(
            @Valid @RequestBody SrvyQitemRequestDTO dto) throws Exception {

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


        SrvyQitemVO vo = dto.toEntity();
        // 로그인한 사용자 ID 자동 설정
        vo.setFrstRegId(loginUserId);
        vo.setLastMdfcnId(loginUserId);

        srvyQitemService.insertSrvyQitem(vo);
        return ResponseEntity.ok(DefaultApiResponse.success(null, "설문 문항이 등록되었습니다."));
    }

    /**
     * 1.3 설문 문항 수정
     * PUT /api/v1/srvyQitem/{srvyQitemSn}
     */
    @Operation(summary = "설문 문항 수정", description = "기존 설문 문항을 수정합니다")
    @PutMapping("/{srvyQitemSn}")
    public ResponseEntity<DefaultApiResponse<Object>> updateSrvyQitem(
            @Parameter(description = "설문 문항번호", required = true, example = "1")
            @PathVariable String srvyQitemSn,
            @Valid @RequestBody SrvyQitemRequestDTO dto) throws Exception {

        // 존재 여부 확인
        SrvyQitemVO vo = new SrvyQitemVO();
        vo.setQitemSn(Integer.parseInt(srvyQitemSn));
        SrvyQitemVO existingQitem = srvyQitemService.selectSrvyQitemDetail(vo);
        if (existingQitem == null) {
            throw new EntityNotFoundException("설문 문항");
        }

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


        // 수정
        SrvyQitemVO updateVO = dto.toEntity();
        updateVO.setQitemSn(Integer.parseInt(srvyQitemSn));
        // 로그인한 사용자 ID 자동 설정
        updateVO.setLastMdfcnId(loginUserId);
        srvyQitemService.updateSrvyQitem(updateVO);

        return ResponseEntity.ok(DefaultApiResponse.success(null, "설문 문항이 수정되었습니다."));
    }

    /**
     * 1.4 설문 문항 삭제
     * DELETE /api/v1/srvyQitem/{srvyQitemSn}
     */
    @Operation(summary = "설문 문항 삭제", description = "설문 문항을 삭제합니다")
    @DeleteMapping("/{srvyQitemSn}")
    public ResponseEntity<DefaultApiResponse<Object>> deleteSrvyQitem(
            @Parameter(description = "설문 문항번호", required = true, example = "1")
            @PathVariable String srvyQitemSn) throws Exception {

        // 존재 여부 확인
        SrvyQitemVO vo = new SrvyQitemVO();
        vo.setQitemSn(Integer.parseInt(srvyQitemSn));
        SrvyQitemVO existingQitem = srvyQitemService.selectSrvyQitemDetail(vo);
        if (existingQitem == null) {
            throw new EntityNotFoundException("설문 문항");
        }

        srvyQitemService.deleteSrvyQitem(vo);
        return ResponseEntity.ok(DefaultApiResponse.success(null, "설문 문항이 삭제되었습니다."));
    }

}
