package com.hzs.retail.login.service.impl;

import cn.hutool.core.codec.Base64Decoder;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.hzs.common.core.constant.msg.SystemMsgConstants;
import com.hzs.common.core.enums.EAccountStatus;
import com.hzs.common.core.enums.ECategory;
import com.hzs.common.core.enums.ELoginType;
import com.hzs.common.core.enums.EStatus;
import com.hzs.common.core.exception.ServiceException;
import com.hzs.common.core.utils.DateUtils;
import com.hzs.common.core.utils.ServletUtils;
import com.hzs.common.core.utils.StringUtils;
import com.hzs.common.core.utils.ip.IpUtils;
import com.hzs.common.domain.member.base.CuMember;
import com.hzs.common.domain.member.ext.CuMemberExt;
import com.hzs.common.domain.retail.member.CuMemberRetailLogin;
import com.hzs.common.security.utils.SecurityUtils;
import com.hzs.common.util.TransactionUtils;
import com.hzs.member.base.dto.LoginMember;
import com.hzs.member.base.service.ICuMemberService;
import com.hzs.retail.login.service.IRetailMemberLoginService;
import com.hzs.retail.member.service.ICuMemberRetailLoginService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;

/**
 * 新零售会员登录服务
 */
@Slf4j
@Service
public class RetailMemberLoginServiceImpl implements IRetailMemberLoginService {

    @Autowired
    private ICuMemberService iCuMemberService;
    @Autowired
    private ICuMemberRetailLoginService iCuMemberRetailLoginService;

    @Override
    public LoginMember login(String userName, String password) {
        // 用户名或密码为空 错误
        if (StringUtils.isAnyBlank(userName, password)) {
            // 用户/密码必须填写
            throw new ServiceException("会员账号或联系方式必须填写");
        }

        CuMemberExt member = iCuMemberService.getRetailMemberByCode(userName);

//        if (userName.startsWith(SysConstants.RETAIL_PREFIX)) {
//            // 会员编号登录
//            member = iCuMemberService.getRetailMemberByCode(userName);
//        } else if ((userName.length() == 11 && userName.startsWith("1"))
//                || Validator.isEmail(userName)) {
//            // 手机号 或 邮箱 登录
//            List<CuMemberExt> memberList = iCuMemberService.listMemberByPhone(userName);
//            if (CollectionUtil.isEmpty(memberList)) {
//                throw new ServiceException("会员账号或联系方式填写有误，请检查后重试");
//            }
//            if (memberList.size() > 1) {
//                // 联系方式超过两个，只能使用会员编号进行登录
//                throw new ServiceException("当前会员需要使用会员编号进行登录");
//            }
//            member = memberList.get(0);
//        } else {
//            // 用户/密码必须填写
//            throw new ServiceException("会员账号或联系方式填写有误，请检查后重试");
//        }

        if (null == member) {
            recordLoginLog(null, EStatus.NO, userName + " 登录会员不存在");
            // 登录用户: %s 不存在
            throw new ServiceException("登录会员不存在");
        }

        LoginMember loginMember = new LoginMember();
        loginMember.setPkId(member.getPkId());
        loginMember.setLoginType(ELoginType.MEMBER.getValue());
        loginMember.setCuMember(member);
        loginMember.setSystemType(member.getSystemType());

        // 密码校验
        if (!SecurityUtils.matchesPassword(password, member.getLoginPwd())) {
            String tmpPassword = new String(Base64Decoder.decode(password)).replace(DateUtils.parseDateToFormat(DateUtils.MM_DD, new Date()), "");
            if (!SecurityUtils.matchesPassword(tmpPassword, member.getLoginPwd())) {
                recordLoginLog(loginMember.getPkId(), EStatus.NO, "用户密码错误");
                // 用户不存在/密码错误
                throw new ServiceException(TransactionUtils.getContent(SystemMsgConstants.USER_ERROR, userName));
            }
        }

        // 非正常点位（死点、已注销），不能登录
        if (ECategory.NORMAL.getValue() != member.getCategory()) {
            recordLoginLog(loginMember.getPkId(), EStatus.NO, "非正常会员不能进行登录");
            // 登录用户: %s 不存在
            throw new ServiceException("登录会员不存在");
        }
        // 账户状态校验
        if (EAccountStatus.FROZEN.getValue() == member.getAccountStatus()
                || EAccountStatus.SHUT_DOWN.getValue() == member.getAccountStatus()) {
            recordLoginLog(loginMember.getPkId(), EStatus.NO, "会员已冻结或封停");
            // 温馨提示：输入信息有误！请稍后再试！
            throw new ServiceException("输入信息有误！请稍后再试！");
        }

        try {
            // 是否更新会员
            boolean updateFlag = false;
            LambdaUpdateWrapper<CuMember> updateWrapper = new LambdaUpdateWrapper<>();
            if (null == member.getPkVertex()) {
                // 如果体系为空处理
                CuMemberExt vertexMember = iCuMemberService.queryParentVertex(member.getPkId());
                if (null != vertexMember) {
                    updateWrapper.set(CuMember::getPkVertex, vertexMember.getPkVertex());
                    updateFlag = true;
                }
            }
//            if (null == member.getPkTeamCode()) {
//                // 空单注册会员，如果团队为空处理
//                CuMemberExt teamMember = iCuMemberService.queryParentTeam(member.getPkId());
//                if (null != teamMember) {
//                    updateWrapper.set(CuMember::getPkTeamCode, teamMember.getPkTeamCode());
//                    updateFlag = true;
//                }
//            }
            if (updateFlag) {
                updateWrapper.eq(CuMember::getPkId, member.getPkId());
                iCuMemberService.update(updateWrapper);
            }
        } catch (Exception e) {
            log.error("会员 {} 补全【体系】错误", member.getMemberCode());
        }

        recordLoginLog(loginMember.getPkId(), EStatus.YES, "登录成功");
        return loginMember;
    }

    /**
     * 记录登录信息
     *
     * @param pkMember 用户ID
     * @param eStatus  登录状态（成功、失败）
     * @param message  消息内容
     */
    private void recordLoginLog(Long pkMember, EStatus eStatus, String message) {
        CuMemberRetailLogin cuMemberRetailLogin = new CuMemberRetailLogin();
        cuMemberRetailLogin.setPkMember(pkMember);
        HttpServletRequest httpServletRequest = ServletUtils.getRequest();
        cuMemberRetailLogin.setLoginId(IpUtils.getIpAddr(httpServletRequest));
        cuMemberRetailLogin.setLoginDevice(ServletUtils.getHeader(httpServletRequest, "source"));
        cuMemberRetailLogin.setStatus(eStatus.getValue());
        cuMemberRetailLogin.setMessage(message);
        // 保存登录日志
        iCuMemberRetailLoginService.save(cuMemberRetailLogin);
    }

}
