package kcg.faics.sec;

import java.util.List;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

import kcg.faics.cmmn.service.CodeService;
import kcg.faics.cmmn.vo.CodeVO;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;

import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;

@Component
public class UserUtil {

	/**
	 * 코드관련 정보 인터페이스.
	 */
	public static CodeService codeService;
	
	@Autowired
	private CodeService codeServInstance;
	
	@PostConstruct
	private void init() {
		codeService = codeServInstance;
	}
	

	/**
	 * 현재 로그인 상태인 회원의 정보를 반환한다. 로그인 상태가 아니면 null값을 반환한다.
	 * @return loginUserVO 회원 정보
	 */
	public static LoginUserVO getMemberInfo() {
		return (LoginUserVO) EgovUserDetailsHelper.getAuthenticatedUser();
	}
	
	/**
	 * 현재 로그인 상태인 회원과 선택한 회원이 동일한지 확인한다.
	 * @return boolean
	 */
	public static boolean isEqualMember(String target) {
		LoginUserVO member = getMemberInfo();
		if (getMemberInfo() != null) {
			if(member.getUserid().equals(target)){
				return true;
			} else{
				return false;
			}
		} else {
			return false;
		}
	}
	
	/**
	 * 각 기관의 담당자(관리자)인지 아닌지를 판별한다.
	 * <pre>시스템관리자일 경우 true 반환</pre>
	 * @return boolean
	 */
	public static boolean isAdmin() {
		LoginUserVO user = getMemberInfo();
		return user.getIsAdmin() || user.getIsSysAdmin();
	}
	/**
	 * 시스템 관리자인지 아닌지를 판변한다.
	 * @return boolean
	 */
	public static boolean isSysAdmin() {
		LoginUserVO user = getMemberInfo();
		return user.getIsSysAdmin();
	}
	/**
	 * 외사경찰인지 아닌지를 판별한다.
	 * @return boolean
	 */
	public static boolean isFa() {
		LoginUserVO user = getMemberInfo();
		if (isAdmin() || user.getRole().startsWith("FA_USER")) return true;
		return false;
	}
	/**
	 * 일반경찰인지 아닌지를 판별한다.
	 * @return boolean
	 */
	public static boolean isNoFa() {
		LoginUserVO user = getMemberInfo();
		if (isAdmin() || user.getRole().startsWith("NFA_USER")) return true;
		return false;
	}
	
	public static Authentication getCurrentAuthentication(){
		SecurityContext context = SecurityContextHolder.getContext();
        Authentication authentication = context.getAuthentication();
        return authentication;
	}
	
	/**
	 * 현재 소속이 지방청인지 판별한다. 
	 * @return boolean
	 */
	public static boolean isRegional() {
		
		LoginUserVO user = getMemberInfo();
		List<CodeVO> agencyCategory = null;
		
		try {
			agencyCategory = codeService.getPlace1SubList(user.getPlace1());
		} catch (Exception e) {
			agencyCategory = null;
		}
		
		return !agencyCategory.isEmpty();
	}
}
