package cokr.xit.fims.crdn.receive.eqpmnt.service.bean;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;

import cokr.xit.fims.cmmn.ftp.RemoteSystemInfo;
import cokr.xit.fims.crdn.CrdnQuery;
import cokr.xit.fims.crdn.receive.eqpmnt.LayoutDescriptor;
import cokr.xit.fims.crdn.receive.eqpmnt.dao.CrdnEqpmntMapper;
import cokr.xit.foundation.component.AbstractBean;
import cokr.xit.foundation.data.DataObject;

@Component("crdnEqpmntBean")
public class CrdnEqpmntBean extends AbstractBean {
	@Resource(name = "crdnEqpmntMapper")
	private CrdnEqpmntMapper crdnEqpmntMapper;

	/** 연계파일 레이아웃 목록을 조회한다.
	 * @param query 연계파일 레이아웃 조회조건
	 * @return 연계파일 레이아웃 목록
	 */
	public List<DataObject> getLinkFileLayoutMetadataList(CrdnQuery query) {
		query.setOrderBy("FILE_LAYOUT_ID");
		return crdnEqpmntMapper.selectLinkFileLayoutMetadataList(query);
	}

	/** 연계파일 레이아웃 상세정보를 조회한다.
	 * @param fileLayoutId 파일 레이아웃 ID
	 * @return 연계파일 레이아웃 상세정보
	 */
	public DataObject getLinkFileLayoutMetadataInfo(String fileLayoutId) {
		return crdnEqpmntMapper.selectLinkFileLayoutMetadataInfo(fileLayoutId);
	}

	/**장비단속파일 레이아웃 정보를 등록한다.
	 * @param layoutDescriptor 레이아웃 정보, remoteSystemInfo 파일연계 원격시스템 정보
	 * @return 저장 여부
	 * <ul><li>저장됐으면 true</li>
	 *     <li>그렇지 않으면 false</li>
	 * </ul>
	 */
	public boolean createLinkFileLayoutMetadata(LayoutDescriptor layoutDescriptor, RemoteSystemInfo remoteSystemInfo) {
		DataObject params =  new DataObject()
			.set("currentUser", currentUser())
			.set("layoutDescriptor", layoutDescriptor)
			.set("remoteSystemInfo", remoteSystemInfo);

		int affected = crdnEqpmntMapper.insertCrdnFileLayout(params)
					 + crdnEqpmntMapper.insertFtpInfo(params);
		if(affected != 2)
			throw new RuntimeException("[F]레이아웃 등록 중 오류가 발생하였습니다.");

		return true;
	}

	/**장비단속파일 레이아웃 정보를 수정한다.
	 * @param layoutDescriptor 레이아웃 정보, remoteSystemInfo 파일연계 원격시스템 정보
	 * @return 저장 여부
	 * <ul><li>저장됐으면 true</li>
	 *     <li>그렇지 않으면 false</li>
	 * </ul>
	 */
	public boolean updateLinkFileLayoutMetadata(LayoutDescriptor layoutDescriptor, RemoteSystemInfo remoteSystemInfo) {
		DataObject params =  new DataObject()
			.set("currentUser", currentUser())
			.set("layoutDescriptor", layoutDescriptor)
			.set("remoteSystemInfo", remoteSystemInfo);

		int affected = crdnEqpmntMapper.updateCrdnFileLayout(params);

		DataObject remoteInfo = crdnEqpmntMapper.selectRemoteInfo(layoutDescriptor.getFileLayoutId());
		affected += remoteInfo == null ?
			crdnEqpmntMapper.insertFtpInfo(params) :
			crdnEqpmntMapper.updateFtpInfo(params);

		if(affected != 2)
			throw new RuntimeException("[F]레이아웃 수정 중 오류가 발생하였습니다.");

		return true;
	}

	/**장비단속파일 레이아웃 정보를 삭제한다.
	 * @param fileLayoutId 파일 레이아웃 ID
	 * @return 저장 여부
	 * <ul><li>저장됐으면 true</li>
	 *     <li>그렇지 않으면 false</li>
	 * </ul>
	 */
	public boolean removeLinkFileLayoutMetadata(String fileLayoutId) {
		DataObject params =  new DataObject()
			.set("currentUser", currentUser())
			.set("fileLayoutId", fileLayoutId);
		return crdnEqpmntMapper.deleteCrdnFileLayout(params) == 1;
	}

	/** 연계파일 레이아웃 엔티티 목록을 조회한다.
	 * @param query 연계파일 레이아웃 조회조건
	 * @return 연계파일 레이아웃 정보
	 */
	public List<LayoutDescriptor> getLinkFileLayoutMetadata(CrdnQuery query) {
		return crdnEqpmntMapper.selectLinkFileLayoutMetadata(query);
	}

	public LayoutDescriptor getLinkFileLayoutMetadata(String fileLayoutId) {
		CrdnQuery query = new CrdnQuery();
		query.setFileLayoutId(fileLayoutId);
		List<LayoutDescriptor> list = crdnEqpmntMapper.selectLinkFileLayoutMetadata(query);
		return isEmpty(list) ? null : list.get(0);
	}
}