package com.eactive.eai.rms.onl.apim.portalterms;

import com.eactive.eai.rms.common.base.BaseAnnotationController;
import com.eactive.eai.rms.common.interceptor.InterceptorSkipController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.HashMap;
import java.util.Map;

/**
 * 에디터 이미지 컨트롤러
 * - summernote 에디터에서 사용하는 이미지 업로드/서빙 API
 * - InterceptorSkipController: 인터셉터의 상세 검증 우회 (필터에서 기본 로그인 체크는 수행됨)
 */
@Controller
@RequestMapping("/onl/apim/editor/image")
public class EditorImageController extends BaseAnnotationController implements InterceptorSkipController {

    private final EditorImageService editorImageService;

    @Autowired
    public EditorImageController(EditorImageService editorImageService) {
        this.editorImageService = editorImageService;
    }

    /**
     * 이미지 업로드 API
     * - summernote에서 이미지 선택/붙여넣기 시 호출
     * - 즉시 DB에 저장하고 플레이스홀더 정보 반환
     *
     * @param file MultipartFile 이미지 파일
     * @return { success: true, fileId: "uuid", fileSn: 1, placeholder: "{{IMG:uuid:1}}" }
     */
    @PostMapping("/upload.json")
    @ResponseBody
    public ResponseEntity<Map<String, Object>> uploadImage(@RequestParam("file") MultipartFile file) {
        Map<String, Object> result = new HashMap<>();

        try {
            // 파일 검증
            if (file.isEmpty()) {
                result.put("success", false);
                result.put("error", "파일이 비어있습니다.");
                return ResponseEntity.badRequest().body(result);
            }

            // 이미지 타입 검증
            String contentType = file.getContentType();
            if (contentType == null || !contentType.startsWith("image/")) {
                result.put("success", false);
                result.put("error", "이미지 파일만 업로드 가능합니다.");
                return ResponseEntity.badRequest().body(result);
            }

            // 파일 크기 검증 (10MB)
            long maxSize = 10 * 1024 * 1024;
            if (file.getSize() > maxSize) {
                result.put("success", false);
                result.put("error", "파일 크기는 10MB를 초과할 수 없습니다.");
                return ResponseEntity.badRequest().body(result);
            }

            // 이미지 저장
            EditorImageDTO saved = editorImageService.saveImage(file);

            // 성공 응답
            result.put("success", true);
            result.put("fileId", saved.getFileId());
            result.put("fileSn", saved.getFileSn());
            result.put("placeholder", "{{IMG:" + saved.getFileId() + ":" + saved.getFileSn() + "}}");

            return ResponseEntity.ok(result);

        } catch (Exception e) {
            logger.error("이미지 업로드 중 오류 발생", e);
            result.put("success", false);
            result.put("error", "이미지 업로드 중 오류가 발생했습니다: " + e.getMessage());
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(result);
        }
    }

    /**
     * 이미지 서빙 API
     * - 브라우저에서 이미지 표시용 (관리자포탈)
     * - 캐시 설정으로 성능 최적화
     *
     * @param fileId 파일 ID (PTL_FILE.FILE_ID)
     * @param fileSn 파일 순번 (PTL_FILE_DETAIL.FILE_SN)
     * @return 이미지 바이너리 데이터
     */
    @GetMapping("/view.do")
    public ResponseEntity<byte[]> viewImage(
            @RequestParam String fileId,
            @RequestParam(defaultValue = "1") int fileSn) {
        try {
            EditorImageDTO image = editorImageService.getImage(fileId, fileSn);

            if (image == null || image.getImageData() == null) {
                return ResponseEntity.notFound().build();
            }

            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.parseMediaType(image.getContentType()));
            headers.setContentLength(image.getFileSize());
            headers.setCacheControl("public, max-age=86400"); // 1일 캐시
            headers.set("Content-Disposition", "inline");

            return new ResponseEntity<>(image.getImageData(), headers, HttpStatus.OK);

        } catch (Exception e) {
            logger.error("이미지 조회 중 오류 발생: fileId=" + fileId + ", fileSn=" + fileSn, e);
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
        }
    }

    /**
     * 이미지 삭제 API
     * - 에디터에서 이미지 삭제 시 호출
     * - DB에서 파일 삭제
     *
     * @param fileId 파일 ID (PTL_FILE.FILE_ID)
     * @return { success: true }
     */
    @PostMapping("/delete.json")
    @ResponseBody
    public ResponseEntity<Map<String, Object>> deleteImage(@RequestParam String fileId) {
        Map<String, Object> result = new HashMap<>();

        try {
            if (fileId == null || fileId.isEmpty()) {
                result.put("success", false);
                result.put("error", "파일 ID가 필요합니다.");
                return ResponseEntity.badRequest().body(result);
            }

            editorImageService.deleteImage(fileId);

            result.put("success", true);
            return ResponseEntity.ok(result);

        } catch (Exception e) {
            logger.error("이미지 삭제 중 오류 발생: fileId=" + fileId, e);
            result.put("success", false);
            result.put("error", "이미지 삭제 중 오류가 발생했습니다: " + e.getMessage());
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(result);
        }
    }
}
