package roomescape.reservation.docs import io.swagger.v3.oas.annotations.Operation import io.swagger.v3.oas.annotations.Parameter import io.swagger.v3.oas.annotations.media.Content import io.swagger.v3.oas.annotations.media.Schema import io.swagger.v3.oas.annotations.responses.ApiResponse import io.swagger.v3.oas.annotations.responses.ApiResponses import io.swagger.v3.oas.annotations.tags.Tag import jakarta.servlet.http.HttpServletResponse import jakarta.validation.Valid import jakarta.validation.constraints.NotNull import org.springframework.http.HttpHeaders import org.springframework.http.HttpStatus import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.* import roomescape.auth.web.support.Admin import roomescape.auth.web.support.LoginRequired import roomescape.common.dto.response.CommonApiResponse import roomescape.common.dto.response.RoomescapeApiResponse import roomescape.common.dto.response.RoomescapeApiResponse.Companion.success import roomescape.common.dto.response.RoomescapeErrorResponse import roomescape.reservation.web.ReservationTimeInfosResponse import roomescape.reservation.web.ReservationTimeRequest import roomescape.reservation.web.ReservationTimeResponse import roomescape.reservation.web.ReservationTimesResponse import java.time.LocalDate @Tag(name = "4. 예약 시간 API", description = "예약 시간을 조회 / 추가 / 삭제할 때 사용합니다.") interface ReservationTimeAPI { @Admin @Operation(summary = "모든 시간 조회", tags = ["관리자 로그인이 필요한 API"]) @ApiResponses(ApiResponse(responseCode = "200", description = "성공", useReturnTypeSchema = true)) fun getAllTimes(): ResponseEntity> @Admin @Operation(summary = "시간 추가", tags = ["관리자 로그인이 필요한 API"]) @ApiResponses(ApiResponse(responseCode = "201", description = "성공", useReturnTypeSchema = true)) fun saveTime( @Valid @RequestBody reservationTimeRequest: ReservationTimeRequest, ): ResponseEntity> @Admin @Operation(summary = "시간 삭제", tags = ["관리자 로그인이 필요한 API"]) @ApiResponses(ApiResponse(responseCode = "204", description = "성공", useReturnTypeSchema = true)) fun removeTime( @PathVariable id: Long ): ResponseEntity> @LoginRequired @Operation(summary = "예약 가능 여부를 포함한 모든 시간 조회", tags = ["로그인이 필요한 API"]) @ApiResponses(ApiResponse(responseCode = "200", description = "성공", useReturnTypeSchema = true)) fun findAllAvailableReservationTimes( @RequestParam date: LocalDate, @RequestParam themeId: Long ): ResponseEntity> }