package cokr.xit.fims.sprt.service.bean;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;

import cokr.xit.base.file.FileInfo;
import cokr.xit.base.file.service.FileQuery;
import cokr.xit.base.file.service.bean.FileBean;
import cokr.xit.fims.crdn.Crdn;
import cokr.xit.fims.sprt.SprtQuery;
import cokr.xit.fims.sprt.dao.TotalInfoMapper;
import cokr.xit.foundation.AbstractComponent;
import cokr.xit.foundation.data.DataObject;

/**개별 총정보 Bean
*
* <p>상세 설명:
*
* <pre>
* ============ 변경 이력 ============
* 2023-08-18	JoJH 최초 작성
* ================================
* </pre>
*/
@Component("sprt02Bean")
public class Sprt02Bean extends AbstractComponent {

	/** 개별 총정보 DAO */
	@Resource(name = "totalInfoMapper")
	private TotalInfoMapper totalInfoMapper;

	/** 파일 Bean */
	@Resource(name="fileBean")
	private FileBean fileBean;

	/**지정한 조건에 따라 개별총정보의 main(단속) 정보를 반환한다.
	 * @param req 개별 총정보 조회 조건
	 * @return main(단속) 정보
	 */
	public DataObject getCrdnInfo(SprtQuery req) {
		return totalInfoMapper.selectCrdnInfo(req);
	}

	/**지정한 조건에 따라 개별총정보의 단속, 납부자 정보를 반환한다.
	 * @param req 개별 총정보 조회 조건
	 * @return 단속, 납부자 정보
	 */
	public DataObject getCrdnPayerInfo(SprtQuery req) {
		return totalInfoMapper.selectCrdnPayerInfo(req);
	}

	/** 단속 사진에 대한 정보를 수정한다.
	 * @param crdn 단속 대장, newFileInfoList 업로드 파일 목록
	 * @return 저장 메시지
	 */
	public String updateCrdnImageFile(Crdn crdn, List<FileInfo> newFileInfoList) {
		// 변수 선언
		boolean retSuccess = false;						// DB 처리 결과
		String retMessage = "";							// 처리 결과 메시지

		// 파일 등록
		int fileInsertEffected = fileBean.create(newFileInfoList);

		// 단속 ID로 파일(TB_FILE) 정보 조회
		List<DataObject> infoFileList = fileBean.getFileList(new FileQuery().setInfoType(Crdn.INF_TYPE)
																			.setInfoKeys(crdn.getCrdnId())
																			.setOrderBy("FILE_ID"));

		if (infoFileList != null && infoFileList.size() > 0) {
	        String[] fileIDs = new String[infoFileList.size()];

	        for (int iLoop = 0; iLoop < infoFileList.size(); iLoop++) {
	        	fileIDs[iLoop] = infoFileList.get(iLoop).string("FILE_ID");
	        }

	        fileBean.reorder(fileIDs);					// 첨부파일 재 정렬
		}

		crdn.setAtchFileCnt(crdn.getAtchFileCnt() + fileInsertEffected);

		// 단속 대장을 수정 한다.
		retSuccess = totalInfoMapper.updateCrdnAtchFileCnt(crdn);
		if (!retSuccess) {
			// 예외를 발생시켜서 오류메세지를 보내고 DB Rollback
			throw new RuntimeException("단속 첨부 파일 갯수 수정에 실패하였습니다.");
		}

		retMessage = "[S] 작업이 정상 처리 되었습니다.";

		return retMessage;
	}

	/** 단속 사진에 대한 정보를 삭제한다.
	 * @param crdnId 단속 Id, atchFileCnt 첨부 파일 갯수, fileIDs 파일 IDs
	 * @return 저장 메시지
	 */
	public String removeCrdnImageFile(String crdnId, Integer atchFileCnt, String... fileIDs) {
		// 변수 선언
		boolean retSuccess = false;						// DB 처리 결과
		String retMessage = "";							// 처리 결과 메시지

		// 파일 삭제
		int fileInsertEffected = fileBean.remove(fileIDs);

		// 단속 ID로 파일(TB_FILE) 정보 조회
		List<DataObject> infoFileList = fileBean.getFileList(new FileQuery().setInfoType(Crdn.INF_TYPE)
																			.setInfoKeys(crdnId)
																			.setOrderBy("FILE_ID"));

		if (infoFileList != null && infoFileList.size() > 0) {
	        String[] reorderFileIDs = new String[infoFileList.size()];

	        for (int iLoop = 0; iLoop < infoFileList.size(); iLoop++) {
	        	reorderFileIDs[iLoop] = infoFileList.get(iLoop).string("FILE_ID");
	        }

	        fileBean.reorder(reorderFileIDs);			// 첨부파일 재 정렬
		}

		Crdn crdn = new Crdn();

		crdn.setCrdnId(crdnId);
		crdn.setAtchFileCnt(atchFileCnt - fileInsertEffected);

		// 단속 대장을 수정 한다.
		retSuccess = totalInfoMapper.updateCrdnAtchFileCnt(crdn);
		if (!retSuccess) {
			// 예외를 발생시켜서 오류메세지를 보내고 DB Rollback
			throw new RuntimeException("단속 첨부 파일 갯수 수정에 실패하였습니다.");
		}

		retMessage = "[S] 작업이 정상 처리 되었습니다.";

		return retMessage;
	}

}
