package com.its.web.service.popup;

import com.its.web.dto.admin.TbWwwPopupDto;
import com.its.web.dto.message.ResultDto;
import com.its.web.dto.notice.AttachFileDto;
import com.its.web.mapper.its.popup.PopupMapper;
import com.its.web.pagination.Pagination;
import com.its.web.util.CommonUtil;
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 java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@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 ResultDto writePopup(TbWwwPopupDto.PopupUpdateReq req) {
        Map<String, String> paramMap = new HashMap<>();
        String message = "작성하신 팝업 공지가 등록 되었습니다.";
        String success = "S";

        paramMap.put("pcontent", req.getPcontent());
        paramMap.put("postFrom", req.getPostFrom());
        paramMap.put("postTo", req.getPostTo());
        paramMap.put("title", req.getTitle());

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

    public ResultDto modifyPopup(TbWwwPopupDto.PopupUpdateReq req) {
        String message = "작성하신 팝업 공지가 수정 되었습니다.";
        String success = "S";
        Map<String, String> paramMap = new HashMap<>();

        paramMap.put("popupId", req.getPopupId());
        paramMap.put("title", req.getTitle());
        paramMap.put("postFrom", req.getPostFrom());
        paramMap.put("postTo", req.getPostTo());
        paramMap.put("pcontent", req.getPcontent());

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

    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 ResultDto deletePopup(String popupId) {
        String success = "S";
        String message = "선택하신 팝업 공지가 삭제되었습니다.";
        int affectedRow = this.mapper.deletePopup(popupId);
        if (affectedRow <= 0) {
            success = "F";
            message = "선택하신 팝업 공지가 삭제되지 않았습니다.";
        }
        return CommonUtil.getResultDto(success, message);
    }

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


}
