package cokr.xit.fims.crdn.dao;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.egovframe.rte.psl.dataaccess.mapper.Mapper;

import cokr.xit.foundation.component.AbstractMapper;
import cokr.xit.foundation.data.DataObject;

/**외부연계 파일을 단속 자료로 변환하기 위한 Mapper
 * @author mjkhan
 */
@Mapper("importMapper")
public interface ImportMapper extends AbstractMapper {
	/**국민신문고 민원의 기관코드, 부서코드를 조건으로 시군구코드를 조회한다.
	 * @param params 파라미터
	 * <ul><li>institutes - 기관코드</li>
	 *     <li>depts - 부서코드</li>
	 * </ul>
	 * @return 시군구코드 목록
	 */
	List<DataObject> selectSggList(Map<String, Object> params);

	/**국민신문고 민원의 기관코드, 부서코드를 조건으로 시군구코드를 조회하여 {"기관코드-부서코드", "시군구코드"} 형식의 맵으로 반환한다.
	 * @param institutes 기관코드
	 * @param depts 부서코드
	 * @return 기관코드-부서코드별 시군구코드
	 */
	default Map<String, String> selectSggs(Iterable<?> institutes, Iterable<?> depts) {
		DataObject params = params()
			.set("institutes", institutes)
			.set("depts", depts);

		List<DataObject> list = selectSggList(params);
		return list.stream()
			.collect(Collectors.toMap(
				row -> row.get("INST_CD") + "-" + row.get("DEPT_CD"),
				row -> row.string("SGG_CD")
			));
	}

	/**국민신문고 민원제목 + 내용에서 단속정보에 필요한 코드들을 추출한다.
	 * @param params 파라미터
	 * <ul><li>violation - 민원제목 + " " + 내용</li>
	 * </ul>
	 * @return 단속정보에 필요한 코드
	 */
	DataObject selectViolationCodes(Map<String, Object> params);

	/**국민신문고 민원제목 + 내용에서 단속정보에 필요한 코드들을 추출한다.
	 * @param violation - 민원제목 + " " + 내용
	 * @return 단속정보에 필요한 코드
	 */
	default DataObject selectViolationCodes(String violation) {
		return selectViolationCodes(params().set("violation", violation));
	}

	/**차종별 과태료 차종코드를 조회한다.
	 * @return 차종별 과태료 차종코드 목록
	 */
	List<DataObject> selectCarMdlCd();

	/**차종별 과태료 차종코드를 조회하여 {"차종종별 코드", "과태료 차종코드"} 형식의 맵으로 반환한다.<br />
	 * 단, 차종종별코드가 "3"일 경우 최대적재량이 4000 kg 이하인 차량은 "3-1", 4000 kg보다 큰 차량은 "3-2"로
	 * 차종종별 코드를 적용해야 한다.
	 * @return {"차종종별 코드", "과태료 차종코드"} 맵
	 */
	default Map<String, String> selectCarMdl() {
		List<DataObject> list = selectCarMdlCd();
		return list.stream()
			.collect(Collectors.toMap(
				row -> row.string("VHCTY_ASORT_CODE"),
				row -> row.string("FFNLG_CARMDL_CD")
			));
	}
}