package sgc.portal.com.com.service;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import sgc.portal.base.exception.UnsupportedGirdStatusException;
import sgc.portal.base.util.EasyHashMap;
import sgc.portal.base.websquare.GridRowStatus;
import sgc.portal.com.com.model.Dtlauth;
import sgc.portal.com.com.model.Stddauth;
import sgc.portal.com.com.model.User;
import sgc.portal.com.com.persistence.ComUserMngMapper;
import sgc.portal.security.PasswordEncryptionService;
import sgc.portal.security.annotation.Secured;
import sgc.portal.security.annotation.SecurityPolicy;
//import kr.co.sgc.fo.inc.com.service.INC0001M00Service;
//import kr.co.sgc.fo.inc.cst.model.IncCustMstr;

/**
 * <pre>
 * 시스템명   : 시스템관리
 * 프로그램ID : ComUserMng
 * 프로그램설명 : 공통 사용자 관리
 * </pre>
 *
 * @author KyungHee Jang(khjang@sgc.co.kr)
 * @version  2020. 8. 2.
 * @since JDK1.8
 */
@Transactional
@Service
public class ComUserMngService {
    /**
     * 변수명은 소문자로 시작하는 CamelCase를 사용합니다.
     * ComUserMngMapper --> comUserMngMapper
     *  2020.08.31 yongsang
     */
    @Autowired
    private ComUserMngMapper comUserMngMapper;

//    @Autowired
//    private INC0001M00Service inc0001M01Service;

    /**
	 * 패스워드 암호화
	 */
    @Resource(name = "passwordEncryptionService")
    private PasswordEncryptionService passwordEncryptionService;

	/**
	 * Select com user mng list.
	 * 사용자기본정보조회
	 *
	 * @param user the user
	 * @return the list
	 */
    public  List<EasyHashMap<String, Object>>  selectComUserMng(User user) {
        return comUserMngMapper.selectComUserMng(user);
    }

	/**
	 * Save com user mng.
	 *
	 * @param users the users
	 */
	/*
	 * Controller와 마찬가지로 리턴이 없는 경우에는 void로 처리합니다.
	 * 특별한 경우가 아니고서는 Exception을 throws 하지 마십시오.
	 * 만약 예외 처리가 필요한 경우 try {} catch {} 로 감싼 다음 사용자 정의 예외를 throw하세요.
	 * public  EasyHashMap<String, Object>  saveComUserMng(List<User> user) throws Exception
	 * -->
                                               ₩	 * public void saveComUserMng(List<User> user)
	 * 그리고 user 매개변수는 List 형이니 명명을 복수형으로 하는 게 좋겠습니다.
	 * List<User> user --> List<User> users
	 *  2020.08.31 yongsang
	 */
	//사용자기본정보등록, 수정, 삭제
	@Secured(policy = SecurityPolicy.NONE)
    public void saveComUserMng(List<User> users) {
	    /*
	     * 메서드 void로 변경으로 사용하지 않는 변수가 되어 주석처리 합니다.
	     * 향후 삭제 부탁 드립니다.
	     *  2020.08.31 yongsang
	     */
//	    EasyHashMap<String, Object> result = new EasyHashMap<String, Object>();

	    /*
	     * 코드 내용상 a, b, c 변수는 무엇인가 연산은 하지만 실제 하는 일은 없는 것으로 보입니다.
	     * 때문에 주석처리 합니다. 필요한 경우가 아니라면 향후 삭제 부탁 드립니다.
	     *  2020.08.31 yongsang
	     */
//	    int a = 0;
//	    int b = 0;
//	    int c = 0;

	    /*
	     * 사용하지 않는 변수로 주석처리 했습니다. 향후 삭제 부탁 드립니다.
	     * 만약 세션 값이 필요하다면 아키텍처상 Controller에서 세션 값을 얻어오고
	     * 매개변수로 Service 측으로 넘기는게 좋겠습니다. HttpSession 자체가 WEB에 의존적인 개첵이기 때문입니다.
	     *  2020.08.31 yongsang
	     */
//	    UserDetails use = (UserDetails)SessionUtil.getAttribute(KriisAttributes.AUTHENTICATION);

	    /*
	     * 안전한 코드를 작성하기 위해서는 user 객체가 null인지 확인이 필요하겠습니다.
	     * if (user != null && user.size() > 0) 로 작성되는 게 좋습니다.
	     * null 체크와 사이즈 체크가 번거로우니
	     * Apache Commons Collection 라이브러리내의 CollectionUtils 객체를 사용하면 좀 더 깔끔한 코드를 생산하면서
	     * 안전한 코드를 작성할 수 있습니다.
	     * if (CollectionUtils.isNotEmpty(user))
	     *  2020.08.31 yongsang
	     */

	    if (CollectionUtils.isNotEmpty(users)) {
	        /*
	         * 루프문을 작성할 경우 JDK 5부터 지원하는 Generic을 이용하면 좀 더 쉽고
	         * 깔끔한 코드를 작성할 수 있습니다.
	         * for (int i = 0; i < users.size(); i++) {
	         * -->
	         * for (User user : users) {
	         *  2020.08.31 yongsang
	         */
	        for (User user : users) {
	            /*
	             * 루프문을 Generic 형태로 변경하였으므로 index에 의한 참조는 불필요합니다.
	             * if (0 < users.get(i).getScrtNo().length()) {
	             * -->
	             * if (0 < user.getScrtNo().length()) {
	             *
	             * 위 CollectionUtils.isNotEmpty(users) 마찬가지로 문자열 변수의 값이 있는지 여부를
	             * 판단하기 위해서는 null 체크가 기본으로 되어야 합니다.
	             * CollectionUtils와 마찬가지로 Apache Commons Lang 라이브러리내 StringUtils를
	             * 사용하면 좀 더 깔끔한 코드를 생상하면서 안전한 코드를 작성할 수 있습니다.
	             * if (0 < users.get(i).getScrtNo().length()) {
	             * -->
	             * if (StringUtils.isNotEmpty(user.getScrtNo())) {
	             *  2020.08.31 yongsang
	             */
	            if (StringUtils.isNotEmpty(user.getScrtNo())) {
	                if(user.getPwInit().equals("Y")){
	                    String encryptedPwd = passwordEncryptionService.encryptPasswordWithSalt(user.getScrtNo());
	                    user.setScrtNo(encryptedPwd);
	                    user.setPswdFailDt("");
	                    user.setPswdFailCnt("0");
	                }
	            }

	            /*
	             * a, b, c 변수는 따로 특별히 사용하지 않으므로 제거하고
	             * 그리드의 로우 상태는 static 변수 사용하여 그 의미를 쉽게 파악할 수 있도록 하는게 좋겠습니다.
	             * 그리고 악의적인 사용자에 의해 CREATED, UPDATED, DELETED 외 다른 값이 전달되었을 경우에는
	             * 예외 처리를 하는 게 좋겠습니다.
	             * 그리고 이런 경우의 로직에는 if 문 보다는 switch 문이 더 좋을 것 같습니다.
	             *  2020.08.31 yongsang
	             */
//	            IncCustMstr incCustMstr = new IncCustMstr();
	            switch (user.getRowStatus()) {
                    case GridRowStatus.CREATED:
                        if(!user.getEmpNo().isEmpty()){
                        	user.setScrtNo("sgc1234!@");
                            String encryptedPwd = passwordEncryptionService.encryptPasswordWithSalt(user.getScrtNo());
                            user.setScrtNo(encryptedPwd);
                        }else{
                            //String pwKey = "sgc"+user.getLginId();
                            String pwKey = "sgc1234!@";
                            String encryptedPwd = passwordEncryptionService.encryptPasswordWithSalt(pwKey);
                            user.setScrtNo(encryptedPwd);
                        }
                        comUserMngMapper.insertComUserMng(user);

//                        incCustMstr.setEmpNo(user.getEmpNo());
//                        incCustMstr.setRowStatus("C");
//                        inc0001M01Service.createEmpCust(incCustMstr);

                        break;
                    case GridRowStatus.UPDATED:
                        comUserMngMapper.updateComUserMng(user);

                        Date time = new Date();
                        SimpleDateFormat format1 = new SimpleDateFormat ( "yyyyMMdd" );

                        int date1 = Integer.parseInt(format1.format(time));
                        int date2 = Integer.parseInt(user.getUseValdDt());

//                        incCustMstr.setEmpNo(user.getEmpNo());
//                        if (date1 > date2) {
//                            incCustMstr.setRowStatus("D");
//                        } else {
//                            incCustMstr.setRowStatus("U");
//                        }
//                        inc0001M01Service.createEmpCust(incCustMstr);

                        break;
                    case GridRowStatus.DELETED:
                        comUserMngMapper.deleteComUserMng(user);

//                        incCustMstr.setEmpNo(user.getEmpNo());
//                        incCustMstr.setRowStatus("D");
//                        inc0001M01Service.createEmpCust(incCustMstr);

                        break;
                    default:
                        throw new UnsupportedGirdStatusException();
                }
            }
        }
    }

	/**
	 * Select com user stddauth mng list.
	 *
	 * @param stddauth the stddauth
	 * @return the list
	 */
//사용자기준권한조회
	public  List<EasyHashMap<String, Object>>  selectComUserStddauthMng(Stddauth stddauth) {
	    return comUserMngMapper.selectComUserStddauthMng(stddauth);
	}

	/**
	 * Save com user stddauth mng.
	 *
	 * @param stddauths the stddauths
	 */
//사용자기준권한등록, 수정, 삭제
	@Secured(policy = SecurityPolicy.NONE)
	public void saveComUserStddauthMng(List<Stddauth> stddauths) {
	    if (CollectionUtils.isNotEmpty(stddauths)) {
	        for (Stddauth stddauth : stddauths) {
	            switch (stddauth.getRowStatus()) {
	            case GridRowStatus.CREATED:
	                comUserMngMapper.insertComUserStddauthMng(stddauth);
	                break;
	            case GridRowStatus.UPDATED:
	                comUserMngMapper.updateComUserStddauthMng(stddauth);
	                break;
	            case GridRowStatus.DELETED:
	                comUserMngMapper.deleteComUserStddauthMng(stddauth);
	                break;
	            default:
	                throw new UnsupportedGirdStatusException();
	            }
	        }
	    }
	}

	/**
	 * Select com user dtlauth mng list.
	 *
	 * @param dtlauth the dtlauth
	 * @return the list
	 */
//사용자상세권한조회
	public  List<EasyHashMap<String, Object>>  selectComUserDtlauthMng(Dtlauth dtlauth) {
	    return comUserMngMapper.selectComUserDtlauthMng(dtlauth);
	}

	/**
	 * Save com user dtlauth mng.
	 *
	 * @param dtlauths the dtlauths
	 */
//사용자상세권한등록, 수정, 삭제
	@Secured(policy = SecurityPolicy.NONE)
	public void saveComUserDtlauthMng(List<Dtlauth> dtlauths) {
	    if (CollectionUtils.isNotEmpty(dtlauths)) {
	        for (Dtlauth dtlauth : dtlauths) {
	            switch (dtlauth.getRowStatus()) {
	            case GridRowStatus.CREATED:
	                comUserMngMapper.insertComUserDtlauthMng(dtlauth);
	                break;
	            case GridRowStatus.DELETED:
	                comUserMngMapper.deleteComUserDtlauthMng(dtlauth);
	                break;
	            default:
	                throw new UnsupportedGirdStatusException();
	            }
	        }
	    }
	}

	/**
	 * Create users list.
	 *
	 * @return the list
	 */
//사원정보 가져오기
    public  List<EasyHashMap<String, Object>>  createUsers() {
        return comUserMngMapper.createUsers();
    }
}
