package incheon.ags.aip.util;

import org.springframework.security.core.Authentication;

import incheon.com.security.vo.LoginVO;
import incheon.com.security.vo.UserAuthrtVO;
import incheon.com.security.vo.UserRoleVO;
public final class AipAuthUtil{

	private static final String DATA_PREFIX = "PERM_DATA_AIP_";

	private AipAuthUtil(){}

	// 관리자 ROLE_AIP_ADMIN
	public static boolean isAipAdmin(LoginVO loginVO){
		if(loginVO == null || loginVO.getUserRoles() == null) return false;

		for(UserRoleVO r : loginVO.getUserRoles()){
			String cd = r.getRoleCd();
			String tp = r.getRoleType();
			if("ROLE_AIP_ADMIN".equals(cd) || "ROLTYP001".equals(tp)) return true;
		}
		return false;
	}

	// 업무 담당자 ROLE_AIP_TASK (ROLE_AIP_TASK 또는 ROLE_AIP_TASK_XXXX)
	public static boolean isAipTask(LoginVO loginVO){
		if(loginVO == null || loginVO.getUserRoles() == null) return false;

		for(UserRoleVO r : loginVO.getUserRoles()){
			String cd = r.getRoleCd();
			if(cd == null) continue;

			if(cd.equals("ROLE_AIP_TASK") || cd.startsWith("ROLE_AIP_TASK_")) return true;
		}
		return false;
	}


	// 권한코드
	public static String getAipAuthCode(LoginVO loginVO){
		if(loginVO == null || loginVO.getUserAuthrts() == null) return null;

		for(UserAuthrtVO r : loginVO.getUserAuthrts()){
			String cd = r.getAuthrtCd();
			if(cd != null && cd.startsWith(DATA_PREFIX)) return cd;
		}
		return null;
	}

	// 담당 시군구 코드
	public static Integer getAipStdgCd(LoginVO loginVO){
		if(loginVO == null || loginVO.getUserAuthrts() == null) return null;

		boolean isAdmin = isAipAdmin(loginVO);

		String firstCode = null;
		String lastCode = null;

		for(UserAuthrtVO r : loginVO.getUserAuthrts()){
			String cd = r.getAuthrtCd();
			if(cd == null || !cd.startsWith(DATA_PREFIX)) continue;

			if(firstCode == null) firstCode = cd;
			lastCode = cd;

			if(isAdmin){
				String numStr = cd.substring(DATA_PREFIX.length());
				try{
					return Integer.parseInt(numStr);
				}catch(NumberFormatException e){}
			}
		}

		String pick = (isAdmin ? firstCode : lastCode);
		if(pick == null) return null;

		String numStr = pick.substring(DATA_PREFIX.length());
		try{
			return Integer.parseInt(numStr);
		}catch(NumberFormatException e){
			return null;
		}
	}

	
	public static class AipAuthInfo{
		private final String loginUserId;
		private final boolean admin;
		private final boolean task;
		private final Integer stdgCd;

		public AipAuthInfo(String loginUserId, boolean admin, boolean task, Integer stdgCd){
			this.loginUserId = loginUserId;
			this.admin = admin;
			this.task = task;
			this.stdgCd = stdgCd;
		}

		public String getLoginUserId(){ return loginUserId; }
		public boolean isAdmin(){ return admin; }
		public boolean isTask(){ return task; }
		public Integer getStdgCd(){ return stdgCd; }
	}

	public static AipAuthInfo from(Authentication authentication){
		if(authentication == null || !(authentication.getPrincipal() instanceof LoginVO)){
			return new AipAuthInfo(null, false, false, null);
		}

		LoginVO loginVO = (LoginVO)authentication.getPrincipal();
		boolean isAdmin = isAipAdmin(loginVO);
		boolean isTask  = isAipTask(loginVO);
		Integer stdgCd  = getAipStdgCd(loginVO);
		String loginUserId = loginVO.getUserId();

		return new AipAuthInfo(loginUserId, isAdmin, isTask, stdgCd);
	}
}