package com.takensoft.common.file.web;

import com.takensoft.common.file.service.FileService;
import com.takensoft.common.file.vo.FileVO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.MultipartRequest;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * @author  : 방선주
 * @since   : 2024.05.23
 *
 * File 관련 컨트롤러
 */

@RestController
@RequiredArgsConstructor
@Slf4j
@RequestMapping(value="/sys/file")
public class FileController {
    private final FileService fileService;

    /**
     * @author 방선주
     * @since  2024.05.21
     * @param  fileId
     * @return
     * @throws Exception
     *
     * 게시판 첨부 파일 다운로드
     */
    @PostMapping("/fileDownload.json")
    public void fileDownload(@RequestBody int fileId, HttpServletResponse response) throws Exception {

        // 파일 정보 조회
        FileVO file = fileService.fileSelectOne(fileId);
        File downloadFile = null;
        // 받은 파일 정보로 파일 다운로드 생성
        if(file != null){
            String filePath = file.getAbsltPath();
            downloadFile = new File(filePath);

            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(file.getFileNm(), "UTF-8") + "\"");
            response.setHeader("Content-Transfer-Encoding", "binary");

            try (OutputStream out = response.getOutputStream(); FileInputStream fis = new FileInputStream(downloadFile)) {
                byte[] buffer = new byte[1024];
                int bytesRead;
                while ((bytesRead = fis.read(buffer)) != -1) {
                    out.write(buffer, 0, bytesRead);
                }
            }
        }
    }

    @PostMapping("/postImageUpload.file")
    public Map<String, Object> handleFileUpload(@RequestPart("upload") MultipartFile file) throws Exception {
        Map<String, Object> response = new HashMap<>();

        String uploadPath = fileService.editorUploadImg(file);

        response.put("upload", true);
        response.put("url", uploadPath);
        return response;
    }
}
