package com.style24.scm.biz.service;

import java.util.Collection;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.style24.core.biz.thirdparty.SsgKakaoSender;
import com.style24.persistence.domain.Menu;
import com.style24.persistence.domain.User;
import com.style24.scm.biz.dao.TssLoginDao;
import com.style24.scm.support.security.session.TssSession;

import lombok.extern.slf4j.Slf4j;

import com.gagaframework.web.util.GagaStringUtil;

/**
 * 로그인 Service
 *
 * @author gagamel
 * @since 2020. 10. 19
 */
@Service
@Slf4j
public class TssLoginService {

	@Autowired
	private TssLoginDao loginDao;

	@Autowired
	private Environment env;

	@Autowired
	private SsgKakaoSender kakaoSender;

	/**
	 * 사용자ID로 사용자 정보 조회
	 * @param userId - 사용자ID
	 * @return
	 * @author gagamel
	 * @since 2020. 10. 5
	 */
	public User getUserById(String userId) {
		return loginDao.getUserById(userId);
	}

	/**
	 * 로그인실패 남기기. 로그인실패여부가 "N:성공"이면 실패건수 0으로 초기화
	 * @param userNo - 사용자번호
	 * @param loginFailYn - 로그인실패여부(Y:실패, N:성공)
	 * @author gagamel
	 * @since 2020. 10. 5
	 */
	@Transactional("shopTxnManager")
	public void createLoginFail(Integer userNo, String loginFailYn) {
		User user = new User();
		user.setUserNo(userNo);
		user.setIpAddr(TssSession.getIpAddress());
		user.setLoginFailYn(loginFailYn);
		loginDao.createLoginFail(user);
	}

	/**
	 * 로그인 실패건수 조회
	 * @param userNo - 사용자번호
	 * @return 로그인 실패건수
	 * @author gagamel
	 * @since 2020. 10. 5
	 */
	public int getLoginFailCount(Integer userNo) {
		User user = new User();
		user.setUserNo(userNo);
		user.setIpAddr(TssSession.getIpAddress());
		return loginDao.getLoginFailCount(user);
	}

	/**
	 * 최종로그인일시 Update
	 * @param userNo - 사용자번호
	 * @author gagamel
	 * @since 2020. 10. 5
	 */
	@Transactional("shopTxnManager")
	public void updateLastLoginDate(Integer userNo) {
		loginDao.updateLastLoginDate(userNo);
	}

	/**
	 * 로그인이력 남기기
	 * @param userNo - 사용자번호
	 * @author gagamel
	 * @date 2020. 10. 5
	 */
	@Transactional("shopTxnManager")
	public void createLoginHistory(Integer userNo) {
		User user = new User();
		user.setUserNo(userNo);
		user.setIpAddr(TssSession.getIpAddress());

		loginDao.createLoginHistory(user);
	}

	/**
	 * 로그인 메뉴 목록
	 * @param userNo - 사용자번호
	 * @return
	 * @author gagamel
	 * @since 2020. 10. 5
	 */
	public Collection<Menu> getLoginMenuList(Integer userNo) {
		return loginDao.getLoginMenuList(userNo);
	}

	/**
	 * 2factor인증번호 발송
	 * @author gagamel
	 * @since 2020. 12. 4
	 */
	@Transactional("shopTxnManager")
	public void sendTwoFactorCertNo() {
		String certNo = GagaStringUtil.getRandomNumber(6);
		log.info("certNo: {}", certNo);

		// TODO: SSG모듈 설치 후 주석 해제해야 함
//		SsgDirectMessage dm = new SsgDirectMessage();
//		dm.setFdestine(TssSession.getInfo().getCellPhnno());
//
//		GagaMap replaceInfo = new GagaMap();
//		replaceInfo.setString("certNo", certNo);
//
//		// 인증번호 6자리 문자메시지 발송
//		kakaoSender.sendSms(SsgKakaoSender.KakaoAnswerSq.CertNoSend.value(), dm, replaceInfo);

		TssSession.setAttribute("tfcertno", certNo);
	}

}
