/** 
 * CommonService.java
 * @author 임새미 
 * @since 2016. 10. 13.
 *
 *  	 수정일                     수정자                                       수정내용
 *  -------------	--------	---------------------------
 *  2016. 10. 13. 	    임새미				       최초생성
 * 
 */
package kcg.faics.cmmn.service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import kcg.faics.cmmn.vo.CodeVO;

/**
 * 코드 관련 Service Interface.
 * 
 * @author kimnomin
 *
 */
public interface CodeService {
	/**
	 * 목록 중 전체를 표현하는 값.
	 */
	String LIST_ALL_VAL = "ALL";
	/**
	 * 목록 중 전체를 표현하는 문자열.
	 */
	String LIST_ALL_STR = "전체";
	/**
	 * 권한 대분류코드.
	 */
	String CODE1_AUTH = "AUTH";	
	/**
	 * 소속 대분류코드.
	 */
	String CODE1_PLACE1 = "C001";
	/**
	 * 계급 대분류 코드. 
	 */
	String CODE1_POSITION = "C002";	
	/**
	 * 치안대상 업종 대분류코드.
	 */
	String CODE1_COPR = "CORP";
	/**
	 * 교육과정 대분류 코드.
	 */
	String CODE1_EDU_COURSE = "EDUC";
	/**
	 * 교육기관 대분류 코드.
	 */
	String CODE1_EDU_PLACE = "EDUP";
	
	/**
	 * 소속 구조.
	 */
	Map<String, String[]> PLACE_CATEGORY = new TreeMap<String, String[]>(String.CASE_INSENSITIVE_ORDER) {
		/**
		 * serialVersionUID.
		 */
		private static final long serialVersionUID = -8213220033671425747L;

		{
			//중부본부
			put("ps90", new String[] { "PS14", "PS16", "PS05", "PS02", "PS50" });
			//제주본부
			put("PS91", new String[] { "PS13", "PS17" });
			//서해본부
			put("PS92", new String[] { "PS06", "PS07", "PS08", "PS09", "ps18" });
			//남해본부
			put("PS93", new String[] { "PS01", "PS11", "PS15", "PS12" });
			//동해본부
			//20171226 울진해양경찰서 추가(PS19)
			put("PS94", new String[] { "PS03", "PS04", "PS10", "PS19" });
			put("PS95", new String[] {});
			put("PS96", new String[] {});
			put("PS97", new String[] {});
			put("PS99", new String[] {});
		}
	};
	
	/**
	 * 외사대상목표 - 치안대상 그룹정보.
	 */
	HashMap<String, String> CORP_GROUP = new HashMap<String, String>() {
		/**
		 * serialVersionUID.
		 */
		private static final long serialVersionUID = -4741380958901687806L;

		{
			put("01", "업무협조기관");
			put("02", "해운.항만관련 협회");
			put("03", "외사관련업체");
			put("04", "외국인고용업체");
			put("05", "외국인투자업체");
		}
	};
	
	/**
	 * 해양경비안전서 코드목록.
	 * 
	 * <pre>
	 * 서귀포해양경비안전서 코드가 변경되었는데 기존 PHP 소스에서는 수정하지 않고 그대로 사용한 듯 하여
	 * PS98 -> PS17 로 변경하였다.
	 * 
	 * 20170330 서해5도특별단 추가(PS50)
	 * 20171226 울진해양경찰서 추가(PS19)
	 * </pre>
	 */
	String[] POLICE_STATION_LIST = { "PS01", "PS02", "PS03", "PS04", "PS05", "PS06",
			"PS07", "PS08", "PS09", "PS10", "PS11", "PS12", "PS13", "PS14", "PS16", "PS17", "ps18", "PS19", "PS50" };

	/**
	 * 코드 정보를 반환한다.
	 * 
	 * @param code1
	 *            대분류 코드
	 * @param code2
	 *            중분류 코드
	 * @return 코드 정보
	 * @throws Exception
	 *             기본 예외 처리
	 */
	CodeVO getCodeValue(String code1, String code2) throws Exception;

	/**
	 * 코드 목록을 반환한다.
	 * 
	 * @param code1
	 *            대분류코드
	 * @param code2
	 *            중분류코드
	 * @return CodeVO 객체 리스트
	 * @throws Exception
	 *             기본 예외 처리
	 */
	List<CodeVO> getCodeValues(String code1, String code2) throws Exception;

	/**
	 * 소속 1 Detph를 반환한다.
	 * 
	 * @param onlyCentral
	 *            중앙부처만 반환 - true, 모든 목록반환 - false
	 * @return 소속 1 목록
	 * @throws Exception
	 *             기본 예외 처리
	 */
	List<CodeVO> getPlace1List(boolean onlyCentral) throws Exception;
	
	/**
	 * 소속 1 Detph를 반환한다.
	 * 
	 * @param onlyCentral
	 *            중앙부처만 반환 - true, 모든 목록반환 - false
	 * @param includeAll
	 *            "전체" 포함여부
	 * @return 소속 1 목록
	 * @throws Exception
	 *             기본 예외 처리
	 */
	List<CodeVO> getPlace1List(boolean onlyCentral, boolean includeAll) throws Exception;

	/**
	 * codes에 해당하는 소속기관을 반환한다.
	 * 
	 * @param codes 소속기관 CODE
	 * @return 소속기관 목록
	 * @throws Exception
	 *             기본 예외 처리
	 */
	List<CodeVO> getPlace1List(String[] codes) throws Exception;
	
	/**
	 * codes에 해당하는 소속기관을 반환한다.
	 * 
	 * @param codes 소속기관 CODE
	 * @param includeAll "전체" 포함여부
	 * @return 소속기관 목록
	 * @throws Exception
	 *             기본 예외 처리
	 */
	List<CodeVO> getPlace1List(String[] codes, boolean includeAll) throws Exception;
	
	/**
	 * 소속 1 Depth 중 code1의 하위 기관을 반환한다. 기존 소스의 get_agency_list와 동일
	 * 
	 * @param place1Code
	 *            소속 1 Depth Code
	 * @return 하위 기관 목록
	 * @throws Exception
	 *             기본 예외 처리
	 */
	List<CodeVO> getPlace1SubList(String place1Code) throws Exception;
	
	/**
	 * 소속1을 포함한 소속 1 Depth 중 code1의 하위 기관을 반환한다.
	 * 
	 * @param place1Code
	 *            소속 1 Depth Code
	 * @return 하위 기관 목록
	 * @throws Exception
	 *             기본 예외 처리
	 */
	List<CodeVO> getPlace1SubListWithMain(String place1Code) throws Exception;

	/**
	 * 소속 1 Depth 중 code1의 상위 기관 코드를 반환한다. 기존 소스의 get_agency_code와 동일
	 * 
	 * @param place1Code
	 *            소속 1 Depth Code
	 * @return 상위 기관 코드
	 * @throws Exception
	 *             기본 예외 처리
	 */
	String getPlace1HighCode(String place1Code) throws Exception;
	
	/**
	 * 소속 기관명을 반환한다.
	 * 
	 * @param placeCode 소속 코드 
	 * @return 소속 기관명
	 * @throws Exception
	 *             기본 예외 처리
	 */
	String getPlace1Str(final String placeCode) throws Exception;
	
	/**
	 * 소속 부서명을 반환한다.
	 * 
	 * @param place1Code 소속 기관코드
	 * @param place2Code 소속 부서코드
	 * @return 소속 부서명
	 * @throws Exception 기본 예외 처리
	 */
	String getPlace2Str(final String place1Code, String place2Code) throws Exception;

	/**
	 * 계급 명칭을 반환한다.
	 * 
	 * @param positionCode 계급 코드
	 * @return 계급 명칭
	 * @throws Exception 기본 예외 처리
	 */
	String getPositionStr(final String positionCode) throws Exception;
	
	/**
	 * 계급 코드 리스트를 반환한다.
	 * @return 계급 코드 리스트
	 * @throws Exception
	 *             기본 예외 처리
	 */
	List<CodeVO> getPositionList() throws Exception;

	/**
	 * 하위소속 코드 리스트를 반환한다.
	 * @param codeVO 상위소속 코드
	 * @return 소속 코드 리스트
	 * @throws Exception
	 *             기본 예외 처리
	 */
	List<CodeVO> getPlace2List(CodeVO codeVO) throws Exception;	
	
	/**
	 * 세부소속 코드 리스트를 반환한다.
	 * @param codeVO 상위소속 코드
	 * @return 소속 코드 리스트
	 * @throws Exception
	 *             기본 예외 처리
	 */
	List<CodeVO> getPlace3List(CodeVO codeVO) throws Exception;	
	
	/**
	 * 직위 코드 리스트를 반환한다.
	 * @return 직위 코드 리스트
	 * @throws Exception
	 *             기본 예외 처리
	 */
	List<CodeVO> getDutiesList() throws Exception;	
	
	/**
	 * 직별 코드 리스트를 반환한다.
	 * @return 직별 코드 리스트
	 * @throws Exception
	 *             기본 예외 처리
	 */
	List<CodeVO> getJobTypeList() throws Exception;	
	
	/**
	 * 학력 코드 리스트를 반환한다.
	 * @return 학력 코드 리스트
	 * @throws Exception
	 *             기본 예외 처리
	 */
	List<CodeVO> getScholarshipList() throws Exception;
	
	/**
	 * 외사대상 관련업체/기관 분류 목록을 반환한다.
	 *
	 * @return 외사대상 관련업체/기관 분류
	 * @throws Exception
	 *             기본 예외 처리
	 */
	List<CodeVO> getCorpOrgList() throws Exception;
	
	/**
	 * 교육과정 목록을 반환한다.
	 * 
	 * @param includeAll
	 *            "전체" 포함여부 
	 * @return 교육과정 목록
	 * @throws Exception
	 *             기본 예외 처리
	 */
	List<CodeVO> getEduCourse(final boolean includeAll) throws Exception;
	
	/**
	 * 교육기관 목록을 반환한다.
	 * 
	 * @param includeAll
	 *            "전체" 포함여부 
	 * @return 교육기관 목록
	 * @throws Exception
	 *             기본 예외 처리
	 */
	List<CodeVO> getEduPlace(final boolean includeAll) throws Exception;
	
	/**
	 * 권한 목록을 반환한다.
	 * 
	 * @return 권한 목록
	 * @throws Exception
	 *             기본 예외 처리
	 */
	List<CodeVO> getAuthList() throws Exception;
	
	/**
	 * code를 수정한다.
	 * 
	 * @param codeVO CodeVO 객체
	 * @return 성공 - 1, 실패 - 0
	 * @throws Exception 기본 예외 처리
	 */
	int updateCode(final CodeVO codeVO) throws Exception;
	
	/**
	 * code를 추가한다.
	 * 
	 * @param codeVO CodeVO 객체
	 * @return 성공 - 1, 실패 - 0
	 * @throws Exception 기본 예외 처리
	 */
	int insertCode(final CodeVO codeVO) throws Exception;

	/**
	 * code를 삭제한다.
	 * 
	 * @param codeVO CodeVO 객체
	 * @return 성공 - 1, 실패 - 0
	 * @throws Exception 기본 예외 처리
	 */
	int deleteCode(final CodeVO codeVO) throws Exception;
}
