package ru.ibs.socrates.confexporter.exception;

import io.swagger.v3.oas.annotations.Hidden;
import jakarta.persistence.EntityNotFoundException;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;


/**
 * Глобальный обработчик исключений для REST-контроллеров.
 * Обеспечивает единообразную обработку исключений и преобразование в HTTP-ответы.
 * 
 * <p>Обрабатывает исключения, возникающие в процессе работы контроллеров,
 * и возвращает соответствующие HTTP-статусы.</p>
 * 
 * @see org.springframework.web.bind.annotation.RestControllerAdvice
 */
@Slf4j
@Hidden
@RestControllerAdvice
public class GlobalExceptionHandler {

  /**
   * Обрабатывает исключения {@link EntityNotFoundException}, возникающие при поиске сущностей.
   * 
   * <p>Преобразует исключение в HTTP-ответ со статусом 404 (Not Found).</p>
   *
   * @param ex перехваченное исключение (автоматически внедряется Spring)
   * @return {@link ResponseEntity} с пустым телом и статусом 404
   * 
   * @see jakarta.persistence.EntityNotFoundException
   * @see java.util.NoSuchElementException
   * @see org.springframework.http.ResponseEntity#notFound()
   * 
   * @example
   * При запросе несуществующей сущности:
   * <pre>{@code
   * HTTP/1.1 404 Not Found
   * }</pre>
   */
  @ExceptionHandler({EntityNotFoundException.class, java.util.NoSuchElementException.class})
  public ResponseEntity<Void> handleEntityNotFound(RuntimeException ex) {
    log.error("{}", ex.getMessage(), ex);
    return ResponseEntity.notFound().build();
  }
  
  /**
   * Обрабатывает исключения {@link Exception}, возникающие при поиске сущностей.
   * 
   * @param res
   * @param ex
   * @return
   */
  @ExceptionHandler(Exception.class)
  public ResponseEntity<Void> handle(HttpServletResponse res, Exception ex) {
    log.error("{}", ex.getMessage(), ex);
    return ResponseEntity.internalServerError().build();
  }
}
