import Cookies from "js-cookie";
import type { DecodedRole, RolePrivilegeType } from "@/lib/features/types";

export const useRoleAccess = () => {
  const checkClientAccess = (scopeType: RolePrivilegeType, featureSlug: string) => {
    if (typeof window === "undefined") return false;
    const token = Cookies.get("admin_scopes");
    if (!token) return false;

    try {
      const base64Url = token.split('.')[1];
      if (!base64Url) return false;
      const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
      const jsonPayload = decodeURIComponent(atob(base64).split('').map(function(c) {
          return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
      }).join(''));
      
      const decoded = JSON.parse(jsonPayload) as { scopes: DecodedRole[]; super_admin: boolean } | null;
      if (decoded?.super_admin) return true;

      if (decoded?.scopes) {
        let hasAccess = false;
        decoded.scopes.forEach((item: DecodedRole) => {
          if (item.feature_slug === featureSlug && item[scopeType]) {
            hasAccess = true;
          }
        });
        return hasAccess;
      }
    } catch (e) {
      return false;
    }
    return false;
  };

  const hasAnyChatbotAccess = () => {
    return checkClientAccess("read", "chatbot-agents") || checkClientAccess("read", "chatbot-prompts");
  };

  const hasAnyMembershipAccess = () => {
    return checkClientAccess("read", "account-types") || checkClientAccess("read", "membership-clubs") || checkClientAccess("read", "charge-centers");
  };

  const hasAnySettingsAccess = () => {
    return checkClientAccess("read", "user-management") || checkClientAccess("read", "role-management");
  };

  const isSuperAdmin = () => {
    if (typeof window === "undefined") return false;
    const token = Cookies.get("admin_scopes");
    if (!token) return false;

    try {
      const base64Url = token.split('.')[1];
      if (!base64Url) return false;
      const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
      const jsonPayload = decodeURIComponent(atob(base64).split('').map(function(c) {
          return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
      }).join(''));
      
      const decoded = JSON.parse(jsonPayload) as { super_admin: boolean };
      return decoded.super_admin === true;
    } catch (e) {
      return false;
    }
  };

  return { checkClientAccess, hasAnyChatbotAccess, hasAnyMembershipAccess, hasAnySettingsAccess, isSuperAdmin };
};
