package com.gx.obe.business;

import java.util.Map;

import org.apache.commons.lang3.StringUtils;

import com.gx.obe.components.core.Constants;
import com.gx.obe.components.core.enumeration.CommonEnum;
import com.gx.obe.components.core.enumeration.UserEnum;
import com.gx.obe.components.core.vo.AuthUserVo;
import com.gx.obe.enttiytdo.BooleanResultDO;
import com.gx.obe.enttiytdo.LoginUserDTO;
import com.gx.obe.enttiytdo.PlatformResult;
import com.gx.obe.http.json.JsonUtil;
import com.gx.obe.http.util.ObjectUtil;
import com.gx.obe.util.utils.MD5Utils;
import com.gx.obe.util.utils.UuidUtils;
import com.gx.obe.web.entity.Result.ResultEntity;
import com.gx.obe.web.entity.auth.AuthUser;
import com.gx.obe.web.platform.service.PlatformUserService;
import com.gx.obe.web.service.UserService;
import com.gx.obe.web.utils.DESUtils;


/** 
 * @Description: 
 * @author mazc 
 */
public class UserLogin {
	
	private UserService  userService = new UserService();
	
	private PlatformUserService  platformUserService = new PlatformUserService();
	
	private boolean isRemote;
	
	public BooleanResultDO loginUser(String userName,String password) {
		BooleanResultDO  result = null;
		//验证本地用户信息(登录成功状态 用户信息)
		ResultEntity<AuthUserVo> resultUser = userService.loginUserAndPassword(userName,MD5Utils.getMD5String(password));
		AuthUser user = null;
		if( null != resultUser.getData()) {
			user = resultUser.getData().getAuthUserEntity();
		}
		//登录成功
		if(ResultEntity.SUCCESS == resultUser.getCode()) {
			if(UserEnum.USER_SOURCE_REMOTE.equals(user.getSource())) {
				isRemote=true;
				//平台验证
				result=  platformVerification(userName,password);
				if(result.isStatus()) {
					//if(result.)
					Constants.USER = user;
					Constants.TOKEN = resultUser.getData().getAtuokthen();
				}
				return result;
			}else {
				Constants.USER = user;
				Constants.TOKEN = resultUser.getData().getAtuokthen();
				return new BooleanResultDO(true,"");
			}
		}else {//登录失败
			if(null == user) {
				//账号不存在平台验证
				result = accountNotExistPlatformVerification(userName,password);
			}else {
				// 更新账号密码
				result = accountUpdatePassword( user, password , userName);
			}
			if(result.isStatus()) {
				Constants.USER = userService.valLoginNameAndPwd(userName,MD5Utils.getMD5String(password));
				if(null == Constants.USER) {
					result.setStatus(false);
					result.setStrMessage("远程登录异常!");
				}
			}
			
			return result;
		}
	}
	
	/**
	 * @Description: 本地账号存在更新密码
	 * @author mazc
	 * @param user
	 * @param password
	 * @param userName
	 * @return 
	 */
	private BooleanResultDO accountUpdatePassword(AuthUser user,String password ,String userName) {
		BooleanResultDO  result = null;
 		if(!UserEnum.USER_SOURCE_LOCAL.equals(user.getSource())) {
 			//平台验证
 			result = platformVerification( userName, password);
 			if(result.isStatus()) {
 				Constants.USER = user;
 				//修改本地用户密码
 				boolean updateResult = userService.updatePassword(userName, MD5Utils.getMD5String(password),result.getStrMessage().length()>4?result.getStrMessage():null);
 				if(updateResult) {
 					result.setStatus(true);
 					result.setStrMessage("已更新本地密码,登录成功");
 				}else {
 					result.setStrMessage("更新本地密码失败,登录失败");
 				}
 				
 				user.setUserPassword(MD5Utils.getMD5String(password));
 				Constants.USER = userService.loginRemote(user);
 				if(null == Constants.USER) {
 					result.setStatus(false);
 					result.setStrMessage("远程登录异常!");
 				}
 			}else {
 				return new BooleanResultDO(false,"用户名或密码错误");		
 			}
 			return result;
		}else {
			Constants.USER = user;
			return new BooleanResultDO(false,"用户名或密码错误");
		}
	}
	
	/**
	 * @Description: 账号不存在平台验证
	 * @author mazc
	 * @param userName
	 * @param password
	 * @return 
	 */
	private BooleanResultDO accountNotExistPlatformVerification(String userName,String password) {
		BooleanResultDO  result = null;
		// 平台验证
		PlatformResult<LoginUserDTO> platformResult = platformUserService.userNameLogin(userName, password);
		if(null == platformResult) {
			return new BooleanResultDO(false,"登录异常");	
		}
		if(Constants.PLATFOR_STATUS_OK.equals((String) platformResult.getHeader().getRet())) {
			result = new BooleanResultDO(true,"");
		}else {
			result = new BooleanResultDO(false,(String) platformResult.getHeader().getMsg());	
		}
		
		LoginUserDTO loginUserDTO = platformResult.getData();
		String checkUserLogin = loginUserDTO.getCheckUserLogin();          
		
		if(result.isStatus()) {
			// 用户保存到本地库
			LoginUserDTO loginUser = platformResult.getData();
			if(ObjectUtil.isNull(loginUser) ) {
				return new BooleanResultDO(false,"登录异常");	
			}
			AuthUser remoteUser = new AuthUser();
			remoteUser.setId(UuidUtils.getUUID());
			remoteUser.setUserName(loginUser.getUserName());
			remoteUser.setUserAccount(userName);
			remoteUser.setUserPassword( MD5Utils.getMD5String(password));
 			remoteUser.setUseStatus(CommonEnum.REAL_STATUS);
 			remoteUser.setCompany(loginUser.getOrgName());
			remoteUser.setSource(UserEnum.USER_SOURCE_REMOTE);
			Constants.USER = userService.loginRemote(remoteUser);
//			remoteUser = userService.createUserInfo(remoteUser);
			if(null == Constants.USER) {
				return new BooleanResultDO(false,"远程登录异常!");	
			}
		}
//		else {
////			 TODO如果服务没升级可以用这个方式登录
//			AuthUser user = userService.valLoginNameAndPwd(userName, MD5Utils.getMD5String(password));
//			Constants.USER = user;
//			return new BooleanResultDO(true,"");	
//			}
		return result;
	}

	/**
	 * @Description: 平台验证
	 * @author mazc
	 * @return 
	 */
	private BooleanResultDO platformVerification(String userName,String password){
		PlatformResult<LoginUserDTO> platformResult = platformUserService.userNameLogin(userName, password);
		if(null == platformResult) { 
			return new BooleanResultDO(false,"登录异常");	
		}
		LoginUserDTO loginUserDTO = platformResult.getData();
		String checkUserLogin = loginUserDTO.getCheckUserLogin();
		if(StringUtils.isEmpty(checkUserLogin)) {
			return new BooleanResultDO(false,"登录异常");
		}
		if(Constants.PLATFOR_STATUS_OK.equals((String) platformResult.getHeader().getRet())) {
			String result = platformUserService.verify(checkUserLogin);
			if(null == result) {
				return new BooleanResultDO(false,"登录异常");	
			}
			try {
				String decrypt = DESUtils.decrypt(result, "utf-8");
				Map<String,String> resultMap = JsonUtil.strToMap(decrypt);
				if(resultMap.get("ret").equals(Constants.PLATFOR_STATUS_OK)) {
					return new BooleanResultDO(true,checkUserLogin);
				}
				return new BooleanResultDO(false,(String) platformResult.getHeader().getMsg()); 
			} catch (Exception e) {
				// TODO Auto-generated catch block
				return new BooleanResultDO(false,"登录异常");
			}   
			
		}else {
			return new BooleanResultDO(false,checkUserLogin);	
		}
	}
	
}