package com.xxl.job.admin.service;

import com.xxl.job.admin.core.model.XxlJobUser;
import com.xxl.job.admin.core.util.CookieUtil;
import com.xxl.job.admin.core.util.I18nUtil;
import com.xxl.job.admin.core.util.JacksonUtil;
import com.xxl.job.admin.dao.XxlJobUserDao;
import com.xxl.job.core.biz.model.ReturnT;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.DigestUtils;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.math.BigInteger;

/**
 * @author xuxueli 2019-05-04 22:13:264
 */
@Configuration
public class LoginService {

	public static final String LOGIN_IDENTITY_KEY = "XXL_JOB_LOGIN_IDENTITY";

	@Resource
	private XxlJobUserDao xxlJobUserDao;

	private String makeToken(XxlJobUser xxlJobUser) {
		String tokenJson = JacksonUtil.writeValueAsString(xxlJobUser);
		String tokenHex = new BigInteger(tokenJson.getBytes()).toString(16);
		return tokenHex;
	}

	private XxlJobUser parseToken(String tokenHex) {
		XxlJobUser xxlJobUser = null;
		if (tokenHex != null) {
			String tokenJson = new String(new BigInteger(tokenHex, 16).toByteArray()); // username_password(md5)
			xxlJobUser = JacksonUtil.readValue(tokenJson, XxlJobUser.class);
		}
		return xxlJobUser;
	}

	public ReturnT<String> login(HttpServletRequest request, HttpServletResponse response, String username,
			String password, boolean ifRemember) {

		// param
		if (username == null || username.trim().length() == 0 || password == null || password.trim().length() == 0) {
			return new ReturnT<String>(500, I18nUtil.getString("login_param_empty"));
		}

		// valid passowrd
		XxlJobUser xxlJobUser = xxlJobUserDao.loadByUserName(username);
		if (xxlJobUser == null) {
			return new ReturnT<String>(500, I18nUtil.getString("login_param_unvalid"));
		}
		String passwordMd5 = DigestUtils.md5DigestAsHex(password.getBytes());
		if (!passwordMd5.equals(xxlJobUser.getPassword())) {
			return new ReturnT<String>(500, I18nUtil.getString("login_param_unvalid"));
		}

		String loginToken = makeToken(xxlJobUser);

		// do login
		CookieUtil.set(response, LOGIN_IDENTITY_KEY, loginToken, ifRemember);
		return ReturnT.SUCCESS;
	}

	/**
	 * logout
	 * @param request
	 * @param response
	 */
	public ReturnT<String> logout(HttpServletRequest request, HttpServletResponse response) {
		CookieUtil.remove(request, response, LOGIN_IDENTITY_KEY);
		return ReturnT.SUCCESS;
	}

	/**
	 * logout
	 * @param request
	 * @return
	 */
	public XxlJobUser ifLogin(HttpServletRequest request, HttpServletResponse response) {
		String cookieToken = CookieUtil.getValue(request, LOGIN_IDENTITY_KEY);
		if (cookieToken != null) {
			XxlJobUser cookieUser = null;
			try {
				cookieUser = parseToken(cookieToken);
			}
			catch (Exception e) {
				logout(request, response);
			}
			if (cookieUser != null) {
				XxlJobUser dbUser = xxlJobUserDao.loadByUserName(cookieUser.getUsername());
				if (dbUser != null) {
					if (cookieUser.getPassword().equals(dbUser.getPassword())) {
						return dbUser;
					}
				}
			}
		}
		return null;
	}

}
