package com.its.web.service.popup;

import com.its.web.dto.admin.TbWwwPopupDto;
import com.its.web.dto.notice.AttachFileDto;
import com.its.web.mapper.its.popup.PopupMapper;
import com.its.web.pagination.Pagination;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

@Slf4j
@RequiredArgsConstructor
@Service
public class PopupService {
    private final PopupMapper mapper;

    /**
     * 팝업 저장 위치
     */
    @Value("${popup-location}")
    String popupLocation;

    /**
     * 전체 조회 (페이지네이션)
     * @param page 현재 페이지
     * @return Pagination Object
     */
    public Pagination findAllPopup(String page) {
        int totalCount = this.mapper.findPopupTotalPage();
        Pagination pagination = new Pagination( page, totalCount, null, null);
        pagination.setList(this.mapper.findAllPopup(pagination));
        return pagination;
    }

    /**
     * 메인 화면 팝업
     * @param num 불러올 개수
     * @return List<TbWwwPopupDto>
     */
    public List<TbWwwPopupDto> findMainPopup(int num) {
        return this.mapper.findMainPopup(num);
    }

    public TbWwwPopupDto findPopup(String popupId) {
        return this.mapper.findPopup(popupId);
    }

    public Map<String, String> writePopup(Map<String, String> paramMap, MultipartFile attachFile) {
        Map<String, String> resultMap = new HashMap<>();
        String message = "작성하신 팝업 공지가 등록 되었습니다.";
        String success = "S";
//        if (attachFile != null && !attachFile.isEmpty()) {
//
//            if (attachFile.getOriginalFilename() != null) {
//                String imgName = attachFile.getOriginalFilename();
//                String ext = imgName.substring(imgName.lastIndexOf("."), imgName.length());
//                String fileId = UUID.randomUUID().toString().replaceAll("-", "");
//                fileId += ext;
//                paramMap.put("imgName", imgName);
//                paramMap.put("imgId", fileId);
//                File file = new File(popupLocation);
//
//                if (!file.exists()) {
//                    file.mkdirs();
//                }
//
//                File transFerFile = new File(popupLocation + "/" +  fileId);
//                try {
//                    attachFile.transferTo(transFerFile);
//                } catch (IOException e) {
//                    message = "이미지 업로드 중 오류가 발생했습니다.";
//                    success = "F";
//                    log.error("TransferTo IOException: {}", e.getMessage());
//                }
//            }
//            else {
//                message = "팝업 공지 이미지 정보가 없습니다.";
//                success = "F";
//            }
//        }
//        else {
//            message = "팝업 공지 이미지 정보가 없습니다.";
//            success = "F";
//        }

        if (success.equals("S")) {
            int affectedRow = this.mapper.insertPopup(paramMap);
            if (affectedRow <= 0) {
                success = "F";
                message = "작성하신 팝업 공지가 등록되지 않았습니다.";
            }
        }
        resultMap.put("message", message);
        resultMap.put("success", success);
        return resultMap;
    }

    public Map<String, String> modifyPopup(Map<String, String> paramMap, MultipartFile attachFile) {
        Map<String, String> resultMap = new HashMap<>();
        String message = "작성하신 팝업 공지가 수정 되었습니다.";
        String success = "S";
        TbWwwPopupDto dto = this.mapper.findPopup(paramMap.get("popupId"));
        String imgId = dto.getImgId();
        String imgName = dto.getImgName();
        if (attachFile != null && !attachFile.isEmpty()) {
            if (attachFile.getOriginalFilename() != null) {
                String fileName = attachFile.getOriginalFilename();
                if (!imgName.equals(fileName)) {
                    String ext = fileName.substring(fileName.lastIndexOf("."), fileName.length());
                    String fileId = UUID.randomUUID().toString().replaceAll("-", "");
                    fileId += ext;
                    imgId = fileId;
                    imgName = fileName;
                    File file = new File(popupLocation);

                    if (!file.isDirectory()) {
                        file.mkdirs();
                    }

                    File transFerFile = new File(popupLocation + imgId);
                    try {
                        attachFile.transferTo(transFerFile);
                    } catch (IOException e) {
                        message = "이미지 업로드 중 오류가 발생했습니다.";
                        success = "F";
                        log.error("TransferTo IOException: {}", e.getMessage());
                    }
                }
            }
        }

        if (success.equals("S")) {
            paramMap.put("imgId", imgId);
            paramMap.put("imgName", imgName);
            int affectedRow = this.mapper.updatePopup(paramMap);
            if (affectedRow <= 0) {
                success = "F";
                message = "작성하신 팝업 공지가 수정되지 않았습니다.";
            }
        }

        resultMap.put("message", message);
        resultMap.put("success", success);
        return resultMap;
    }

    public AttachFileDto downloadAttach(String imgId, String imgName) {
        AttachFileDto dto = new AttachFileDto();
        String message = null;
        if (imgId != null && imgName != null) {
            File file = new File(popupLocation, imgId);
            int fileSize = (int) file.length();

            if (file.exists() && fileSize > 0) {
                try {
                    byte[] byteArray = FileUtils.readFileToByteArray(file);
                    if (byteArray.length > 0) {
                        int i = 0;
                        dto.setAttachFile(new byte[byteArray.length]);
                        for (byte b : byteArray) {
                            dto.getAttachFile()[i++] = b;
                        }
                        message = "파일 전송 완료.";
                    }
                    else {
                        message = "파일을 찾을 수 없습니다.";
                    }
                }
                catch (FileNotFoundException e) {
                    log.error("File Not FoundException");
                    message = "파일을 찾을 수 없습니다.";
                } catch (IOException e) {
                    log.error("IOException");
                    message = "파일을 읽는 중 오류가 발생하였습니다.";
                }
            }
        }
        else {
            message = "파일을 찾일 수 없습니다.";
        }
        dto.setMessage(message);
        return dto;
    }

    public Map<String, String> deletePopup(String popupId) {
        Map<String, String> resultMap = new HashMap<>();
        String success = "S";
        String message = "선택하신 팝업 공지가 삭제되었습니다.";
        int affectedRow = this.mapper.deletePopup(popupId);
        if (affectedRow <= 0) {
            success = "F";
            message = "선택하신 팝업 공지가 삭제되지 않았습니다.";
        }
        resultMap.put("success", success);
        resultMap.put("message", message);
        return resultMap;
    }

    public List<TbWwwPopupDto> findDisplayPopup() {
        return this.mapper.findDisplayPopup();
    }
}
