package go.kr.project.common.controller;

import egovframework.util.ApiResponseUtil;
import egovframework.util.SessionUtil;
import go.kr.project.common.model.HtmlEditorFileVO;
import go.kr.project.common.service.HtmlEditorService;
import io.swagger.v3.oas.annotations.Operation;
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 lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Objects;

/**
 * packageName    : go.kr.project.common.controller
 * fileName       : HtmlEditorController
 * author         : 개발자
 * date           : 2025-05-23
 * description    : HTML 에디터 컨트롤러
 * ===========================================================
 * DATE              AUTHOR             NOTE
 * -----------------------------------------------------------
 * 2025-05-23        개발자       최초 생성
 */
@RequestMapping("/common/htmlEditor")
@Controller
@RequiredArgsConstructor
@Slf4j
@Tag(name = "HTML 에디터", description = "HTML 에디터 관련 API")
public class HtmlEditorController {

    private final HtmlEditorService htmlEditorService;

    /**
     * HTML 에디터에서 이미지 업로드 처리
     * 
     * @param image 업로드할 이미지 파일
     * @param moduleId 모듈 ID (선택적)
     * @param request HTTP 요청 객체
     * @return 업로드된 이미지 URL과 성공 상태를 담은 ResponseEntity 객체
     */
    @Operation(summary = "에디터 이미지 업로드", description = "HTML 에디터에서 이미지를 업로드합니다.")
    @ApiResponses(value = {
        @ApiResponse(responseCode = "200", description = "이미지 업로드 성공"),
        @ApiResponse(responseCode = "400", description = "이미지 업로드 실패"),
        @ApiResponse(description = "오류로 인한 실패")
    })
    @PostMapping("/uploadImage.ajax")
    public ResponseEntity<?> uploadImage(
            @RequestParam("image") MultipartFile image,
            @RequestParam(value = "moduleId", required = false) String moduleId,
            HttpServletRequest request) {
        try {
            // 이미지 파일 검증
            if (image.isEmpty()) {
                return ApiResponseUtil.error("이미지 파일이 없습니다.");
            }

            // 이미지 파일 확장자 검증
            String originalFilename = image.getOriginalFilename();
            String fileExt = Objects.requireNonNull(originalFilename).substring(originalFilename.lastIndexOf(".") + 1).toLowerCase();

            if (!fileExt.matches("jpg|jpeg|png|gif")) {
                return ApiResponseUtil.error("허용되지 않은 이미지 형식입니다. (jpg, jpeg, png, gif만 가능)");
            }

            // 파일 업로드 처리
            HtmlEditorFileVO uploadedFile = htmlEditorService.uploadHtmlEditorFile(
                    image, moduleId, "image", SessionUtil.getUserId());

            // 이미지 URL 생성
            String imageUrl = request.getContextPath() + "/common/htmlEditor/download.do?fileId=" + uploadedFile.getFileId();

            // 응답 데이터 생성
            HashMap<String, Object> data = new HashMap<>();
            data.put("url", imageUrl);
            data.put("alt", uploadedFile.getOriginalFileNm());
            data.put("fileId", uploadedFile.getFileId());

            return ApiResponseUtil.success(data);
        } catch (Exception e) {
            log.error("이미지 업로드 중 오류 발생", e);
            return ApiResponseUtil.error("이미지 업로드 중 오류가 발생했습니다: " + e.getMessage());
        }
    }

    /**
     * 파일을 다운로드합니다.
     * 
     * @param fileId 다운로드할 파일의 ID
     * @param request HTTP 요청 객체
     * @param response HTTP 응답 객체
     */
    @Operation(summary = "파일 다운로드", description = "HTML 에디터에서 사용된 파일을 다운로드합니다.")
    @ApiResponses(value = {
        @ApiResponse(responseCode = "200", description = "파일 다운로드 성공"),
        @ApiResponse(responseCode = "400", description = "파일 다운로드 실패"),
        @ApiResponse(description = "오류로 인한 실패")
    })
    @GetMapping("/download.do")
    public void downloadFile(
            @RequestParam String fileId,
            HttpServletRequest request,
            HttpServletResponse response) {
        // 파일 다운로드 처리 - 서비스 계층으로 위임
        htmlEditorService.downloadHtmlEditorFile(fileId, request, response);
    }

}