package com.interplug.qcast.biz.estimate;

import com.interplug.qcast.biz.estimate.dto.*;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;

@Slf4j
@RestController
@RequestMapping("/api/estimate")
@RequiredArgsConstructor
@Tag(name = "EstimateController", description = "견적서 관련 API")
public class EstimateController {
  private final EstimateService estimateService;

  @Operation(description = "1차점 가격 관리 목록을 조회한다.")
  @GetMapping("/price/store-price-list")
  @ResponseStatus(HttpStatus.OK)
  public EstimateApiResponse selectStorePriceList(PriceRequest priceRequest) throws Exception {
    return estimateService.selectStorePriceList(priceRequest);
  }

  @Operation(description = "아이템 가격 목록을 조회한다.")
  @PostMapping("/price/item-price-list")
  @ResponseStatus(HttpStatus.OK)
  public EstimateApiResponse selectItemPriceList(@RequestBody PriceRequest priceRequest)
      throws Exception {
    return estimateService.selectItemPriceList(priceRequest);
  }

  @Operation(description = "견적서 특이사항 타이틀 목록을 조회한다.")
  @GetMapping("/special-note-title-list")
  @ResponseStatus(HttpStatus.OK)
  public List<NoteResponse> selectSpecialNoteTitleList(NoteRequest noteRequest) throws Exception {
    return estimateService.selectSpecialNoteTitleList(noteRequest);
  }

  @Operation(description = "견적서 특이사항 목록을 조회한다.")
  @GetMapping("/special-note-list")
  @ResponseStatus(HttpStatus.OK)
  public List<NoteResponse> selectSpecialNoteList(NoteRequest noteRequest) throws Exception {
    return estimateService.selectSpecialNoteList(noteRequest);
  }

  @Operation(description = "견적서 상세를 조회한다.")
  @GetMapping("/{objectNo}/{planNo}/detail")
  @ResponseStatus(HttpStatus.OK)
  public EstimateResponse selectObjectDetail(
      @PathVariable String objectNo, @PathVariable String planNo) throws Exception {
    return estimateService.selectEstimateDetail(objectNo, planNo);
  }

  @Operation(description = "견적서를 저장한다.")
  @PostMapping("/save-estimate")
  @ResponseStatus(HttpStatus.CREATED)
  public void insertEstimate(@RequestBody EstimateRequest estimateRequest) throws Exception {
    estimateService.insertEstimate(estimateRequest);
  }

  @Operation(description = "견적서를 복사한다.")
  @PostMapping("/save-estimate-copy")
  @ResponseStatus(HttpStatus.CREATED)
  public EstimateResponse insertEstimateCopy(@RequestBody EstimateCopyRequest estimateCopyRequest)
      throws Exception {
    return estimateService.insertEstimateCopy(estimateCopyRequest);
  }

  @Operation(description = "견적서를 엑셀로 다운로드한다.")
  @PostMapping("/excel-download")
  @ResponseStatus(HttpStatus.OK)
  public void excelDownload(
      HttpServletRequest request,
      HttpServletResponse response,
      @RequestBody EstimateRequest estimateRequest)
      throws Exception {
    estimateService.excelDownload(request, response, estimateRequest);
  }
}
