package kcg.imis.report.web;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;

import kcg.imis.cmmn.service.CodeService;
import kcg.imis.cmmn.vo.CodeVO;
import kcg.imis.member.vo.Duty;
import kcg.imis.report.vo.ReportSearchVO;
import kcg.imis.sec.LoginUserVO;
import kcg.imis.sec.UserUtil;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
  * @FileName : ReportCommon.java
  * @Project : 국제해양프로젝트
  * @Date : 2018. 3. 29. 
  * @작성자 : Moon
  * @변경이력 : 
  * @프로그램 설명 :
 */
@Component
public class ReportCommon {

	/**
	 * 접속한 사용자 정보를 담을 객체 
	 */
	private static LoginUserVO user = null;

	/**
	 * 코드관련 정보 인터페이스.
	 */
	public static CodeService codeService;

	@Autowired
	private CodeService codeServInstance;
	
	@PostConstruct
	private void init() {
		codeService = codeServInstance;
	}
		

	/**
	 * 견문 결재 타입을 반환한다.
	 * @param inStateCode 견문 상태 코드
	 * @return 결재 타입
	 */
	public static int getApprovalType(final String inStateCode) {
		int docGroupCode = getMyGroupCode();
		int stateCode0 = Character.getNumericValue(inStateCode.charAt(0));
		int stateCode1 = Character.getNumericValue(inStateCode.charAt(1));
		
		if ((stateCode0 > 1 || (stateCode0 == 1 && stateCode1 >= 2)) && docGroupCode == 1) {
			return 1;
		} else if ((stateCode0 > 2 || (stateCode0 == 2 && stateCode1 >= 2)) && docGroupCode <= 2) {
			return 2;
		} else if (stateCode0 == 3 && stateCode1 >= 2 && docGroupCode <= 3) {
			return 3;
		}
		
		return 0;
	}
	
	/**
	 * 해당 소속 코드의 상위 소속 코드를 반환한다.
	 * 
	 * @param placeCode 소속코드
	 * @return 소속코드
	 */
	public static String getAgencyCode(final String placeCode) {
		try {
			return codeService.getPlace1HighCode(placeCode);
		} catch (Exception e) {
			return placeCode;
		}
	}
	
	/**
	 * 소속명을 약칭으로 반환한다.
	 * 
	 * @param placeStr 소속명
	 * @return 소속약칭
	 */
	public static String getPlaceShortName(final String placeStr) {
		String result = placeStr;
		
		result = result.replace("지방해양경찰청", "청");
		result = result.replace("해양경찰서", "서");
		result = result.replace("해양경찰학교", "경찰학교");
		
		return result;
	}
	
	/**
	 * 견문의 상태코드에 따라 상태명을 반환한다.
	 * 
	 * @param stateCode 견문상태코드
	 * @return 견문 상태 텍스트
	 */
	public static String getStateCodeNm(final String stateCode) {
		String state = "";
		
		if (stateCode.length() != 2) {
			return "Unknown";
		}
		if (stateCode.equals("99")) {
			return "임시 저장";
		}
		if (Character.getNumericValue(stateCode.charAt(0)) > getMyGroupCode()) {
			return "결재 완료";
		}
		
		state = "Unknown";
		switch (stateCode.charAt(1)) {
			case '1':
				state = "결재 대기";
				break;
			case '2':
				state = "국제법규정보팀장 결재";
				break;
			case '3':
				state = "국제협력담당관 결재";
				break;
			case '4':
				state = "결재 완료";
				break;
		default:
			break;
		}
		return state;
	}
	

	/**
	 * 접속한 사용자의 소속에 따른 사용자 그룹코드를 반환한다.
	 * 
	 * @return 그룹코드
	 */
	public static int getMyGroupCode() {
		LoginUserVO user = UserUtil.getMemberInfo();
		return getGroupCode(user.getPlace1());
	}
	/**
	 * 소속 코드에 따른 사용자 그룹코드를 반환한다.
	 * 
	 * @param code 소속코드(PS00)
	 * @return 그룹코드
	 */
	public static int getGroupCode(final String code) {
		if ("PS00".equalsIgnoreCase(code)) { // 본부
			return 3;
		} else if (isRegional(code)) { // 지방청
			return 2;
		} else { // 경찰서
			return 1;
		}
	}
	
	/**
	 * 소속 코드가 지방청인지 판단한다.
	 * 
	 * @param placeCode 소속 코드
	 * @return 지방청이면 true, 아니면 false
	 */
	public static boolean isRegional(final String placeCode) {
		List<CodeVO> agencyCategory = null;
		try {
			agencyCategory = codeService.getPlace1SubList(placeCode);
		} catch (Exception e) {
			agencyCategory = new ArrayList<CodeVO>();
		}
		
		return !agencyCategory.isEmpty();
	}
	
	/**
	 * 접속한 사용자 정보를 견문 검색 조건 객체에 저장하여 반환한다.
	 * 
	 * @param reportSearchVO 견문 검색 조건 객체
	 * @return 접속한 사용자 정보가 포함된 견문 검색 조건 객체
	 */
	public static ReportSearchVO setSearchUserInfo(final ReportSearchVO reportSearchVO) {
		ReportSearchVO result = reportSearchVO;
		
		LoginUserVO loginUserVO = UserUtil.getMemberInfo();
		
		result.setUserid(loginUserVO.getUserid());
		result.setUsegrade(loginUserVO.getUsegrade());
		result.setType(loginUserVO.getType());
		result.setMyGroupCode(ReportCommon.getMyGroupCode());
		result.setDuties(loginUserVO.getDutyStr());
		result.setUserPlace(loginUserVO.getPlace1());
		
		return result;
	}

	/**
	 * 결재에서 사용할 직위 코드를 반환한다.
	 * 
	 * <pre>
	 * 사용자 테이블에는 문자형 (03:계장, 04:과장) 이고
	 * php소스상 결재부문에서 사용하는 직위코드는 숫자형 (1:나머지, 2:계장, 3:과장) 이다.
	 * </pre>
	 * 
	 * @param duties
	 *            사용자 테이블에 저장된 직위 코드
	 * @return (1:나머지, 2:계장, 3:과장)
	 */
	public static int getDutiesCodeForApprove(final String duties) {
		int dutiesCode = 1;
		if (duties == null) {
			return dutiesCode;
		}
		
		switch (duties) {
		case Duty.SECTION:
			dutiesCode = 2;
			break;
		case Duty.HEAD:
			dutiesCode = 3;
			break;
		default:
			break;
		}

		return dutiesCode;
	}
	
}
