/** 
 * AuthServiceImpl.java
 * @author 임새미 
 * @since 2016. 11. 7.
 *
 *  	 수정일                     수정자                                       수정내용
 *  -------------	--------	---------------------------
 *  2016. 11. 7. 	    임새미				       최초생성
 * 
 */
package kcg.faics.member.service.impl;

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

import javax.annotation.Resource;

import kcg.faics.member.service.MemberAuthService;
import kcg.faics.member.vo.MemberSearchVO;
import kcg.faics.member.vo.MemberVO;
import kcg.faics.sec.LoginUserVO;
import kcg.faics.sec.service.impl.SecurityMapper;

import org.springframework.stereotype.Service;

/** 
 * AuthServiceImpl.java
 * @author 임새미 
 * @since 2016. 11. 7.
 *
 *  	 수정일                     수정자                                       수정내용
 *  -------------	--------	---------------------------
 *  2016. 11. 7. 	    임새미				       최초생성
 * 
 */
@Service("memberAuthService")
public class MemberAuthServiceImpl implements MemberAuthService {
	
	@Resource(name = "memberAuthMapper")
	MemberAuthMapper memberAuthMapper;
	@Resource(name = "securityMapper")
	SecurityMapper securityMapper;

	/**
	 * 과장정보를 반환한다.
	 * 
	 * @param place1 소속기관 코드
	 * @return 과장정보
	 * @throws Exception 기본 예외 처리
	 */
	@Override
	public MemberVO getHead(final String place1) throws Exception {
		return memberAuthMapper.getHead(place1);
	}

	/**
	 * 계장정보를 반환한다.
	 * 
	 * @param place1 소속기관 코드
	 * @return 계장정보
	 * @throws Exception 기본 예외 처리
	 */
	@Override
	public MemberVO getSection(final String place1) throws Exception {
		return memberAuthMapper.getSection(place1);
	}
	
	@Override
	public int getDutiesForRptApprove(final String userid, final String place1)
			throws Exception {
		int retVal = 1;
		MemberVO headVO = getHead(place1);
		MemberVO sectionVO = getSection(place1);

		if (userid.equals(headVO.getUserid())) {
			retVal = 3;
		} else if (userid.equals(sectionVO.getUserid())) {
			retVal = 2;
		} else {
			retVal = 1;
		}
		
		return retVal;
	}

	@Override
	public int getDutiesForRptApprove(final MemberVO memberVO) throws Exception {
		return getDutiesForRptApprove(memberVO.getUserid(), memberVO.getPlace1());
	}
	
	/**
	 * 외사경찰 리스트를 반환한다.
	 * 
	 * @param searchVO searchVO 객체
	 * @return hashmap : head - 과장정보, section - 계장정보, resultList - 외사경찰리스트
	 * @throws Exception 기본 예외 처리
	 */
	@Override
	public HashMap<String, Object> getMemberListByPlace1(final MemberSearchVO searchVO) throws Exception {
		
		MemberVO headVO = getHead(searchVO.getPlace1());
		MemberVO sectionVO = getSection(searchVO.getPlace1());
		
		List<LoginUserVO> userList = memberAuthMapper.getMemberListByPlace1(searchVO);
		Iterator<LoginUserVO> it = userList.iterator();
		while (it.hasNext()) {
			LoginUserVO user = it.next();
			/* 과장? */
			if (headVO != null) {
				String head = headVO.getUserid();
				user.setAuthHead(head != null && head.equals(user.getUserid()) ? 1 : 0);
			}
			/* 계장? */
			if (sectionVO != null) {
				String section = sectionVO.getUserid();
				user.setAuthSection(section != null && section.equals(user.getUserid()) ? 1 : 0);
			}
			
			Map<String, Object> rptAu = (Map<String, Object>) securityMapper.getReportAgentAuCode(user.getUserid());
			int authCode = 0;
			if (rptAu != null) {
				
				if (rptAu.get("CODE") == null) {
					authCode = 32;
				} else {
					authCode = Integer.parseInt(rptAu.get("CODE").toString());
				}
				
			}
			user.setAuthCode(authCode);
			user.setAuthSearch(authCode & 1);
			user.setAuthStatistics(authCode & 2);
			user.setAuthWaitList(authCode & 4);
			user.setAuthManage(authCode & 8);
			user.setAuthProxySection(authCode & 16);
			user.setAuthProxyHead(authCode & 32);
		}
		
		
		HashMap<String, Object> result = new HashMap<String, Object>();
		result.put("head", headVO);
		result.put("section", sectionVO);
		result.put("resultList", userList);
		
		return result;
	}
	
	/**
	 * 외사경찰 수를 반환한다.
	 * 
	 * @param searchVO searchVO 객체
	 * @return 전체 외사경찰 수
	 * @throws Exception 기본 예외 처리
	 */
	@Override
	public int getMemberListByPlace1Cnt(final MemberSearchVO searchVO) throws Exception {
		return memberAuthMapper.getMemberListByPlace1Cnt(searchVO);
	}

	/**
	 * 외사경찰의 권한을 설정한다.
	 * 
	 * @param memberVO userid, usegrade 정보
	 * @return 결과 : 성공 - 1, 실패 - 0
	 * @throws Exception 기본 예외 처리
	 */
	@Override
	public int updateMemberAuth(final MemberVO memberVO) throws Exception {
		return memberAuthMapper.updateMemberAuth(memberVO);
	}
	
	/**
	 * 외사경찰의 견문권한을 설정한다.
	 * 
	 * @param memberVO userid, usegrade 정보
	 * @return 결과 : 성공 - 1, 실패 - 0
	 * @throws Exception 기본 예외 처리
	 */
	@Override
	public int updateMemberRpt(final MemberVO memberVO) throws Exception {
		HashMap<String, Object> map = memberAuthMapper.getMemberRpt(memberVO);
		int result = 0;
		if (map != null) {
			result = memberAuthMapper.updateMemberRpt(memberVO);
		} else {
			result = memberAuthMapper.insertMemberRpt(memberVO);
		}
		return result;
	}
	
	/**
	 * 외사경찰 부서 계장 권한을 설정한다.
	 * 
	 * @param memberVO userid 정보
	 * @return 결과 : 성공 - 1, 실패 - 0
	 * @throws Exception 기본 예외 처리
	 */
	@Override
	public int updateSection(final MemberVO memberVO) throws Exception {
		return memberAuthMapper.updateSection(memberVO);
	}
	
	/**
	 * 외사경찰 부서 과장 권한을 설정한다.
	 * 
	 * @param memberVO userid 정보
	 * @return 결과 : 성공 - 1, 실패 - 0
	 * @throws Exception 기본 예외 처리
	 */
	@Override
	public int updateHead(final MemberVO memberVO) throws Exception {
		return memberAuthMapper.updateHead(memberVO);
	}


}
