package com.interplug.qcast.biz.canvaspopupstatus;

import com.interplug.qcast.biz.canvaspopupstatus.dto.CanvasPopupStatus;
import com.interplug.qcast.config.Exception.ErrorCode;
import com.interplug.qcast.config.Exception.QcastException;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/v1/canvas-popup-status")
@RequiredArgsConstructor
@Tag(name = "CanvasPopupStatusController", description = "Canvas Popup Status 관련 API")
public class CanvasPopupStatusController {

  private final CanvasPopupStatusService canvasPopupStatusService;

  /**
   * 캔버스 팝업 상태를 조회한다.
   *
   * @param objectNo 물건정보 번호
   * @param planNo plan 번호
   * @param popupType 캔버스 팝업 단계
   * @return 조회된 CanvasPopupStatus 객체, 조회된 데이터가 없을 경우 빈 객체 반환
   */
  @Operation(description = "캔버스 팝업 상태를 조회한다.")
  @GetMapping
  public CanvasPopupStatus getCanvasPopupStatus(
      @RequestParam @Schema(description = "물건정보 번호") String objectNo,
      @RequestParam @Schema(description = "plan 번호") Integer planNo,
      @RequestParam @Schema(description = "캔버스 팝업 단계") String popupType)
      throws QcastException {
    if (objectNo == null
        || objectNo.trim().isEmpty()
        || planNo == null
        || popupType == null
        || popupType.trim().isEmpty()) {
      throw new QcastException(ErrorCode.INVALID_INPUT_VALUE);
    }
    return canvasPopupStatusService.selectCanvasPopupStatus(objectNo, planNo, popupType);
  }

  /**
   * 캔버스 팝업 상태를 저장 또는 수정한다.
   *
   * @param canvasPopupStatus 저장 또는 수정할 CanvasPopupStatus 객체
   * @throws QcastException 저장 또는 수정 중 예외 발생 시
   */
  @Operation(description = "캔버스 팝업 상태를 저장 또는 수정한다.")
  @PostMapping
  public void saveCanvasPopupStatus(@RequestBody CanvasPopupStatus canvasPopupStatus)
      throws QcastException {
    canvasPopupStatusService.saveCanvasPopupStatus(canvasPopupStatus);
  }

  /**
   * 캔버스 팝업 상태를 삭제한다. (미사용)
   *
   * @param canvasPopupStatus 삭제할 CanvasPopupStatus 객체
   * @throws QcastException 삭제 중 예외 발생 시
   */
  @Operation(description = "캔버스 팝업 상태를 삭제한다. (미사용)")
  @DeleteMapping
  @ResponseStatus(HttpStatus.NO_CONTENT)
  public void deleteCanvasPopupStatus(@RequestBody CanvasPopupStatus canvasPopupStatus)
      throws QcastException {
    canvasPopupStatusService.deleteCanvasPopupStatus(canvasPopupStatus);
  }
}
