package com.hys.app.framework.context.user;

import cn.hutool.core.util.ObjectUtil;
import com.hys.app.framework.exception.ServiceException;
import com.hys.app.framework.security.model.Admin;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;

/**
 * 用户上下文
 * Created by kingapex on 2018/3/12.
 *
 * @author kingapex
 * @version 1.0
 * @since 7.0.0
 * 2018/3/12
 */
public class AdminUserContext {

    /**
     * 获取当前管理员
     *
     * @return
     */
    public static Admin getAdmin() {


        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication == null) {
            return null;
        }
        Object someOne = authentication.getDetails();
        if (someOne != null && someOne instanceof Admin) {
            return (Admin) someOne;
        }
        return null;


    }

    /**
     * 获取当前管理员id
     *
     * @return
     */
    public static Long getAdminUserId() {
        Admin admin = getAdmin();
        if (admin == null) {
            return null;
        }
        return admin.getUid();
    }

    /**
     * 获取当前管理员账号
     *
     * @return
     */
    public static String getAdminUserName() {
        Admin admin = getAdmin();
        if (admin == null) {
            return null;
        }
        return admin.getUsername();
    }

    /**
     * 获取当前管理员账号
     *
     * @return
     */
    public static Long getCompanyId() {
        Admin admin = getAdmin();
        if (admin == null) {
            return null;
        }
        if (ObjectUtil.isNull(admin.getCompanyId())) {
            return null;
        }
        return admin.getCompanyId();
    }

    /**
     * 获取当前管理员账号
     *
     * @return
     */
    public static Long hasCompany() {
        Admin admin = getAdmin();
        if (admin == null) {
            throw new ServiceException("未查询到人员信息");
        }
        if (ObjectUtil.isNull(admin.getCompanyId()) || admin.getFounder() == 1) {
            throw new ServiceException("平台工作人员不允许操作公司内部业务");
        }
        return admin.getCompanyId();
    }

    /**
     * 获取当前管理员
     *
     * @return
     */
    public static Boolean hasFound() {
        Admin admin = getAdmin();
        if (admin != null && admin.getFounder() == 1) {
            return true;
        }
        return false;
    }

    /**
     * 获取当前管理员
     *
     * @return
     */
    public static void hasAdmin() {
        if (AdminUserContext.hasFound()) {
            throw new ServiceException("平台工作人员，不允许进行此操作");
        }
        if (!"admin".equals(AdminUserContext.getAdminUserName())) {
            throw new ServiceException("只有管理员才能进行此操作");
        }
    }

    /**
     * 获取当前管理员
     *
     * @return
     */
    public static void hasAdminAndSuper() {
        if (!AdminUserContext.hasFound() && !"admin".equals(AdminUserContext.getAdminUserName())) {
            throw new ServiceException("只有管理员才能进行此操作");
        }
    }


    /**
     * 是否是平台管理员登录    todo 后面做到平台管理员选择公司的时候  在那时候放入公司id
     *
     * @return
     */
    public static void hasSuperAdminQuery(Long companyId) {
        Admin admin = getAdmin();
        if (admin.getFounder() == 1 && ObjectUtil.isNull(companyId)) {
            throw new ServiceException("平台管理员查看业务数据请先选择公司");
        }else if (admin.getFounder() == 1 && ObjectUtil.isNotNull(companyId)){
            admin.setCompanyId(companyId);
        }
    }
}
