package com.dbnt.faisp.equip.service;


import com.dbnt.faisp.equip.mapper.EquipMapper;
import com.dbnt.faisp.equip.model.Equip;
import com.dbnt.faisp.equip.model.Equip.EquipId;
import com.dbnt.faisp.equip.model.EquipFile;
import com.dbnt.faisp.equip.model.EquipFile.EquipFileId;
import com.dbnt.faisp.equip.model.EquipLog;
import com.dbnt.faisp.equip.repository.EquipFileRepository;
import com.dbnt.faisp.equip.repository.EquipLogRepository;
import com.dbnt.faisp.equip.repository.EquipRepository;
import com.dbnt.faisp.userInfo.model.UserInfo;
import com.dbnt.faisp.util.ParamMap;
import com.dbnt.faisp.util.Utils;

import lombok.RequiredArgsConstructor;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.time.LocalDateTime;
import java.util.*;

@Service
@RequiredArgsConstructor
public class EquipService {
	@Value("${spring.servlet.multipart.location}")
	  protected String locationPath;

	private final EquipRepository equipRepository;
	private final EquipFileRepository equipFileRepository;
	private final EquipLogRepository equipLogRepository;
	private final EquipMapper equipMapper;
	
	
	@Transactional
	public void saveEquip(Equip equip, MultipartHttpServletRequest request) {
		Equip dbEquip = equipRepository.findFirstByOrderByEquKeyDesc();
		try {
			if(dbEquip == null) {
				equip.setEquKey(1);
				equip.setVersionNo(1);
				equipRepository.save(equip);
			} else {
				equip.setEquKey(dbEquip.getEquKey()+1);
				equip.setVersionNo(1);
				equipRepository.save(equip);
			}
				saveFile(equip,request);
				EquipLog equLog = new EquipLog();
				equLog.setEquType(equip.getEquType());
				equLog.setDetailType(equip.getDetailType());
				equLog.setElContents("입력");
				equLog.setWrtNm(equip.getWrtNm());
				equLog.setWrtOrgan(equip.getWrtOrgan());
				equLog.setWrtDt(equip.getWrtDt());
				equipLogRepository.save(equLog);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void saveFile(Equip equip, MultipartHttpServletRequest mRequest) throws Exception {
		try {
			String path = locationPath;
			String FileSize;
			File dir = new File(path);
			if(!dir.exists()) dir.mkdir();
			//파일등록	
			List<MultipartFile> mFiles = mRequest.getFiles("file");
			for(int i = 0; i < mFiles.size(); i++) {
				MultipartFile mFile = mFiles.get(i);
				FileSize = calculationSize(mFile.getSize());
				if(!"".equals(mFile.getOriginalFilename())){
					String fileName = mFile.getOriginalFilename();
					if(fileName.contains("\\")){
						String notSecuredFileName = fileName.substring(fileName.lastIndexOf("\\") +1);
						fileName = ("".equals(notSecuredFileName) || null == notSecuredFileName) ? fileName : notSecuredFileName;
					};

					String fileExt = Utils.getFileExtention(fileName);
					String saveName = Utils.generationSaveName() + "." + fileExt;
					FileCopyUtils.copy(mFile.getBytes(), new File(path, saveName));

					EquipFile equipFile = new EquipFile();
					equipFile.setEquKey(equip.getEquKey());
					equipFile.setVersionNo(equip.getVersionNo());					
					equipFile.setOrigNm(fileName);
					equipFile.setConvNm(saveName);
					equipFile.setFileExtn(fileExt);
					equipFile.setFilePath(path);
					equipFile.setFileSize(FileSize);

					equipFileRepository.save(equipFile);
				} else {
					EquipFile equipFile = new EquipFile();
					equipFile.setEquKey(equip.getEquKey());
					equipFile.setVersionNo(equip.getVersionNo());					
					equipFileRepository.save(equipFile);
				}
			}

		} catch (Exception e) {
			throw e;
		}		
	}
	
	
	private String calculationSize(double fileSize){
	    String[] units = {"bytes", "KB", "MB", "GB", "TB", "PB"};
	    double unitSelector = Math.floor(Math.log(fileSize)/Math.log(1024));
	    if(fileSize>0){
	      return Math.round((fileSize/Math.pow(1024, unitSelector))*100)/100d+" "+units[(int)unitSelector];
	    }else{
	      return "";
	    }
	  }

	public List<ParamMap> selectEquipStatus(Equip equip) {
		return equipMapper.selectEquipStatus(equip);
	}

	public List<Equip> selectEquipList(Equip equip) {
		return equipMapper.selectEquipList(equip);
	}

	public Integer selectEquipListCnt(Equip equip) {
		return equipMapper.selectEquipListCnt(equip);
	}

	public Equip selectEquipInfo(Equip equip) {
		return equipMapper.selectEquipInfo(equip);
	}
    
	@Transactional
	public int updateEquip(Equip equip, MultipartHttpServletRequest request) {
		try {
			 Equip dbEquip = equipRepository.findById(new EquipId(equip.getEquKey(), equip.getVersionNo())).orElse(null);
			 Equip equipTmp = new Equip();
			 equipTmp.setEquKey(dbEquip.getEquKey());
			 equipTmp.setVersionNo(dbEquip.getVersionNo()+1);
			 equipTmp.setMgtOrgan(equip.getMgtOrgan());
			 equipTmp.setEquType(equip.getEquType());
			 equipTmp.setDetailType(equip.getDetailType());
			 equipTmp.setStoredYear(equip.getStoredYear());
			 equipTmp.setItemQty(equip.getItemQty());
			 equipTmp.setItemCondition(equip.getItemCondition());
			 equipTmp.setNote(equip.getNote());
			 equipTmp.setWrtOrgan(equip.getWrtOrgan());
			 equipTmp.setWrtNm(equip.getWrtNm());
			 equipTmp.setWrtDt(equip.getWrtDt());
			 equipRepository.save(equipTmp);
			 updateFile(equip,equipTmp,request);
			 EquipLog equLog = new EquipLog();
				equLog.setEquType(equip.getEquType());
				equLog.setDetailType(equip.getDetailType());
				equLog.setElContents("수정");
				equLog.setWrtNm(equip.getWrtNm());
				equLog.setWrtOrgan(equip.getWrtOrgan());
				equLog.setWrtDt(equip.getWrtDt());
				equipLogRepository.save(equLog);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return equip.getEquKey();
	}
	
	public void updateFile(Equip equip,Equip equipTmp, MultipartHttpServletRequest mRequest) throws Exception {
		try {
			String path = locationPath;
			String FileSize;
			File dir = new File(path);
			if(!dir.exists()) dir.mkdir();
			
			//이미지 삭제했을경우
			if(equip.getDeleteFileKey() != null) {
				EquipFile equFile = new EquipFile();
				equFile.setEquKey(equip.getDeleteFileKey());
				equFile.setVersionNo(equip.getDeleteFileVnum());
				EquipFile dbEquFile = equipFileRepository.findById(new EquipFileId(equFile.getEquKey(), equFile.getVersionNo())).orElse(null);
				if(dbEquFile != null) {
					File file = new File(dbEquFile.getFilePath(), dbEquFile.getConvNm());

					if(file.exists()) {

						file.delete();
					}
				}
			}
			//파일등록			
			List<MultipartFile> mFiles = mRequest.getFiles("file");
			for(int i = 0; i < mFiles.size(); i++) {
				MultipartFile mFile = mFiles.get(i);
				FileSize = calculationSize(mFile.getSize());
				if(!"".equals(mFile.getOriginalFilename())){
					String fileName = mFile.getOriginalFilename();
					if(fileName.contains("\\")){
						String notSecuredFileName = fileName.substring(fileName.lastIndexOf("\\") +1);
						fileName = ("".equals(notSecuredFileName) || null == notSecuredFileName) ? fileName : notSecuredFileName;
					};

					String fileExt = Utils.getFileExtention(fileName);
					String saveName = Utils.generationSaveName() + "." + fileExt;
					FileCopyUtils.copy(mFile.getBytes(), new File(path, saveName));

					EquipFile equipFile = new EquipFile();
					equipFile.setEquKey(equipTmp.getEquKey());
					equipFile.setVersionNo(equipTmp.getVersionNo());					
					equipFile.setOrigNm(fileName);
					equipFile.setConvNm(saveName);
					equipFile.setFileExtn(fileExt);
					equipFile.setFilePath(path);
					equipFile.setFileSize(FileSize);

					equipFileRepository.save(equipFile);
				} else if(equip.getNoUpdateImg() != null) {
					EquipFile equipFile = new EquipFile();
					equipFile.setEquKey(equipTmp.getEquKey());
					equipFile.setVersionNo(equipTmp.getVersionNo());
					EquipFile dbEquFile = equipFileRepository.findById(new EquipFileId(equip.getEquKey(), equip.getVersionNo())).orElse(null);
					equipFile.setOrigNm(dbEquFile.getOrigNm());
					equipFile.setConvNm(dbEquFile.getConvNm());
					equipFile.setFileExtn(dbEquFile.getFileExtn());
					equipFile.setFilePath(dbEquFile.getFilePath());
					equipFile.setFileSize(dbEquFile.getFileSize());
					equipFileRepository.save(equipFile);
				} else {
					EquipFile equipFile = new EquipFile();
					equipFile.setEquKey(equipTmp.getEquKey());
					equipFile.setVersionNo(equipTmp.getVersionNo());										
					equipFileRepository.save(equipFile);
				}
			}
		} catch (Exception e) {
			throw e;
		}		
	}

	public ParamMap selectEduType(Equip equip) {
		return equipMapper.selectEduType(equip);
	}

	public List<Equip> selectHistoryView(Equip equip) {
		return equipRepository.findByEquKeyOrderByWrtDtDesc(equip.getEquKey());
	}

	public Equip selectHistoryDetail(Equip equip) {
		return equipMapper.selectHistoryDetail(equip);
	}
	
	@Transactional
	public void equipDelete(List<Equip> equip,UserInfo loginUser) {
		for(Equip equ: equip) {
			//파일삭제
			Equip dbEquip = equipMapper.selectEquipInfo(equ);
			if(dbEquip.getOrigNm() != null) {
				File file = new File(dbEquip.getFilePath(), dbEquip.getConvNm());

				if(file.exists()) {

					file.delete();
				}
			}
			equipRepository.deleteByEquKey(equ.getEquKey());
			equipFileRepository.deleteByEquKey(equ.getEquKey());
			EquipLog equLog = new EquipLog();
			equLog.setEquType(dbEquip.getEquType());
			equLog.setDetailType(dbEquip.getDetailType());
			equLog.setElContents("삭제");
			equLog.setWrtNm(loginUser.getUserId());
			equLog.setWrtOrgan(loginUser.getOgCd());
			equLog.setWrtDt(LocalDateTime.now());
			equipLogRepository.save(equLog);
		}
		
	}

	public List<EquipLog> selectEquipLogList(EquipLog equipLog) {
		return equipMapper.selectEquipLogList(equipLog);
	}

	public Integer selectEquipLogListCnt(EquipLog equipLog) {
		return equipMapper.selectEquipLogListCnt(equipLog);
	}

	public String selectEquipFirstId(Equip equip) {
		return equipMapper.selectEquipFirstId(equip);
	}
  

	
}
