package com.samsung.sample.board.controller; // 샘플 게시판 컨트롤러 패키지이다.

import java.util.List; // 목록 반환을 위해 List 타입을 사용한다.

import org.apache.commons.lang3.StringUtils; // 문자열 검증을 위해 StringUtils를 사용한다.
import org.springframework.stereotype.Controller; // 일반 컨트롤러 등록을 위해 Controller를 사용한다.
import org.springframework.web.bind.annotation.DeleteMapping; // 삭제 매핑을 사용한다.
import org.springframework.web.bind.annotation.GetMapping; // 조회 매핑을 사용한다.
import org.springframework.web.bind.annotation.PathVariable; // 경로 변수를 사용한다.
import org.springframework.web.bind.annotation.PostMapping; // 등록 매핑을 사용한다.
import org.springframework.web.bind.annotation.PutMapping; // 수정 매핑을 사용한다.
import org.springframework.web.bind.annotation.RequestBody; // 요청 본문 매핑을 사용한다.
import org.springframework.web.bind.annotation.ResponseBody; // 메서드 단위 응답 바디 처리를 사용한다.

import com.samsung.sample.board.SampleBoardService; // 샘플 게시판 서비스 인터페이스를 사용한다.
import com.samsung.sample.board.entity.SampleBoard; // 샘플 게시판 엔티티를 사용한다.

import io.swagger.v3.oas.annotations.Operation; // Swagger 요약 설명을 사용한다.
import jakarta.servlet.http.HttpServletRequest; // 페이지 포워딩 요청 정보를 사용한다.

@Controller // 페이지 포워딩과 REST 응답을 함께 처리하는 컨트롤러를 등록한다.
public class SampleBoardController { // samples 테이블 CRUD API와 pgBoard 페이지 포워딩을 함께 처리하는 컨트롤러이다.

    private final SampleBoardService sampleBoardService; // 샘플 게시판 서비스이다.

    public SampleBoardController(SampleBoardService sampleBoardService) { // 생성자에서 서비스를 주입받는다.
        this.sampleBoardService = sampleBoardService; // 주입받은 서비스를 필드에 저장한다.
    } // 생성자를 종료한다.

    @GetMapping({"/admin/pgBoard/sampleBoardPage"}) // pgBoard 페이지 URL을 처리한다.
    public String forwardSampleBoardPage(HttpServletRequest request) { // 요청 URL을 유지한 채 프론트 진입점으로 전달한다.
        return "forward:/index.html?redirect=" + request.getRequestURI(); // 현재 요청 URI를 redirect 파라미터로 전달한다.
    } // 포워딩 메서드를 종료한다.

    @ResponseBody // 목록 조회 결과를 JSON 본문으로 반환한다.
    @Operation(summary = "샘플 게시판 목록 조회") // 게시글 목록 조회 API 설명이다.
    @GetMapping("/pg-board/samples") // GET 목록 조회 경로를 매핑한다.
    public List<SampleBoard> getSampleBoardList() { // 게시글 목록을 반환한다.
        return sampleBoardService.getSampleBoardList(); // 서비스 목록 조회를 호출한다.
    } // 목록 조회 메서드를 종료한다.

    @ResponseBody // 상세 조회 결과를 JSON 본문으로 반환한다.
    @Operation(summary = "샘플 게시판 상세 조회") // 게시글 상세 조회 API 설명이다.
    @GetMapping("/pg-board/samples/{id}") // GET 상세 조회 경로를 매핑한다.
    public SampleBoard getSampleBoard(@PathVariable Integer id) { // 게시글 상세를 반환한다.
        return sampleBoardService.getSampleBoard(id); // 서비스 상세 조회를 호출한다.
    } // 상세 조회 메서드를 종료한다.

    @ResponseBody // 등록 결과를 JSON 본문으로 반환한다.
    @Operation(summary = "샘플 게시판 등록") // 게시글 등록 API 설명이다.
    @PostMapping("/pg-board/samples") // POST 등록 경로를 매핑한다.
    public SampleBoard createSampleBoard(@RequestBody SampleBoard sampleBoard) { // 게시글을 등록한다.
        validateSampleBoard(sampleBoard); // 요청 데이터를 검증한다.
        return sampleBoardService.createSampleBoard(sampleBoard); // 서비스 등록을 호출한다.
    } // 등록 메서드를 종료한다.

    @ResponseBody // 수정 결과를 JSON 본문으로 반환한다.
    @Operation(summary = "샘플 게시판 수정") // 게시글 수정 API 설명이다.
    @PutMapping("/pg-board/samples/{id}") // PUT 수정 경로를 매핑한다.
    public SampleBoard updateSampleBoard(@PathVariable Integer id, @RequestBody SampleBoard sampleBoard) { // 게시글을 수정한다.
        validateSampleBoard(sampleBoard); // 요청 데이터를 검증한다.
        sampleBoard.setId(id); // 경로의 식별자를 엔티티에 설정한다.
        return sampleBoardService.updateSampleBoard(sampleBoard); // 서비스 수정을 호출한다.
    } // 수정 메서드를 종료한다.

    @ResponseBody // 삭제 결과를 HTTP 본문 없이 처리한다.
    @Operation(summary = "샘플 게시판 삭제") // 게시글 삭제 API 설명이다.
    @DeleteMapping("/pg-board/samples/{id}") // DELETE 삭제 경로를 매핑한다.
    public void deleteSampleBoard(@PathVariable Integer id) { // 게시글을 삭제한다.
        sampleBoardService.deleteSampleBoard(id); // 서비스 삭제를 호출한다.
    } // 삭제 메서드를 종료한다.

    private void validateSampleBoard(SampleBoard sampleBoard) { // 등록 및 수정 요청 데이터를 검증한다.
        if (sampleBoard == null) { // 요청 본문이 없는 경우를 확인한다.
            throw new IllegalArgumentException("게시글 정보는 필수입니다."); // 필수 데이터 누락 예외를 발생시킨다.
        } // null 검사 블록을 종료한다.
        if (StringUtils.isBlank(sampleBoard.getTitle())) { // 제목 공백 여부를 확인한다.
            throw new IllegalArgumentException("제목은 필수입니다."); // 제목 누락 예외를 발생시킨다.
        } // 제목 검사 블록을 종료한다.
        if (StringUtils.isBlank(sampleBoard.getContent())) { // 본문 공백 여부를 확인한다.
            throw new IllegalArgumentException("내용은 필수입니다."); // 본문 누락 예외를 발생시킨다.
        } // 본문 검사 블록을 종료한다.
        if (StringUtils.isBlank(sampleBoard.getAuthor())) { // 작성자 공백 여부를 확인한다.
            throw new IllegalArgumentException("작성자는 필수입니다."); // 작성자 누락 예외를 발생시킨다.
        } // 작성자 검사 블록을 종료한다.
    } // 검증 메서드를 종료한다.
} // 컨트롤러 정의를 종료한다.
