package com.xy.xyaicpzs.util;

import com.xy.xyaicpzs.common.ErrorCode;
import com.xy.xyaicpzs.common.ResultUtils;
import com.xy.xyaicpzs.common.response.ApiResponse;
import com.xy.xyaicpzs.domain.entity.User;
import com.xy.xyaicpzs.service.UserService;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * 用户权限验证工具类
 */
@Component
public class UserAuthValidator {

    @Autowired
    private UserService userService;

    // 权限常量
    public static final String ROLE_USER = "user";
    public static final String ROLE_ADMIN = "admin";
    public static final String ROLE_SUPER_ADMIN = "superAdmin";

    /**
     * 验证用户登录和VIP权限
     * @param request HTTP请求
     * @return 如果验证失败返回错误响应，成功返回null
     */
    public <T> ApiResponse<T> validateUserAuth(HttpServletRequest request) {
        User loginUser = userService.getLoginUser(request);
        if (loginUser == null) {
            return ResultUtils.error(ErrorCode.NOT_LOGIN_ERROR, "您还未登录，请登录后查看");
        }

        Date now = new Date();
        if (loginUser.getVipExpire() == null || loginUser.getVipExpire().before(now)) {
            return ResultUtils.error(ErrorCode.NO_AUTH_ERROR, "VIP会员已过期，请续费后使用");
        }

        return null; // 验证通过
    }

    /**
     * 验证用户是否为超级管理员
     * @param request HTTP请求
     * @return 如果验证失败返回错误响应，成功返回null
     */
    public <T> ApiResponse<T> validateSuperAdminAuth(HttpServletRequest request) {
        User loginUser = userService.getLoginUser(request);
        if (loginUser == null) {
            return ResultUtils.error(ErrorCode.NOT_LOGIN_ERROR, "您还未登录，请先登录");
        }

        if (!ROLE_SUPER_ADMIN.equals(loginUser.getUserRole())) {
            return ResultUtils.error(ErrorCode.NO_AUTH_ERROR, "需要超级管理员权限");
        }

        return null; // 验证通过
    }

    /**
     * 验证用户是否为管理员（admin或superAdmin）
     * @param request HTTP请求
     * @return 如果验证失败返回错误响应，成功返回null
     */
    public <T> ApiResponse<T> validateAdminAuth(HttpServletRequest request) {
        User loginUser = userService.getLoginUser(request);
        if (loginUser == null) {
            return ResultUtils.error(ErrorCode.NOT_LOGIN_ERROR, "您还未登录，请先登录");
        }

        String userRole = loginUser.getUserRole();
        if (!ROLE_ADMIN.equals(userRole) && !ROLE_SUPER_ADMIN.equals(userRole)) {
            return ResultUtils.error(ErrorCode.NO_AUTH_ERROR, "需要管理员权限");
        }

        return null; // 验证通过
    }

    /**
     * 验证用户登录状态
     * @param request HTTP请求
     * @return 如果验证失败返回错误响应，成功返回null
     */
    public <T> ApiResponse<T> validateLoginAuth(HttpServletRequest request) {
        User loginUser = userService.getLoginUser(request);
        if (loginUser == null) {
            return ResultUtils.error(ErrorCode.NOT_LOGIN_ERROR, "您还未登录，请先登录");
        }

        return null; // 验证通过
    }

    /**
     * 检查用户是否为超级管理员
     * @param user 用户对象
     * @return 是否为超级管理员
     */
    public boolean isSuperAdmin(User user) {
        return user != null && ROLE_SUPER_ADMIN.equals(user.getUserRole());
    }

    /**
     * 检查用户是否为管理员（admin或superAdmin）
     * @param user 用户对象
     * @return 是否为管理员
     */
    public boolean isAdmin(User user) {
        if (user == null) {
            return false;
        }
        String userRole = user.getUserRole();
        return ROLE_ADMIN.equals(userRole) || ROLE_SUPER_ADMIN.equals(userRole);
    }

    /**
     * 获取当前登录用户
     * @param request HTTP请求
     * @return 当前登录用户，如果未登录返回null
     */
    public User getCurrentUser(HttpServletRequest request) {
        return userService.getLoginUser(request);
    }
}
