import { User } from "@/types/api";
import { normalizeRoleForAccess } from "@/lib/role-access";

export const AUTH_SESSION_MAX_AGE_SECONDS = 60 * 60 * 24 * 7;

const AUTH_COOKIE_PATH = "path=/";
const AUTH_COOKIE_MAX_AGE = `max-age=${AUTH_SESSION_MAX_AGE_SECONDS}`;
const EXPIRED_COOKIE_MAX_AGE = "max-age=0";

function dispatchUserUpdated() {
  if (typeof window !== "undefined") {
    window.dispatchEvent(new Event("user-updated"));
  }
}

export function persistAuthSession(token: string, user: User) {
  if (typeof window === "undefined") return;

  localStorage.setItem("token", token);
  localStorage.setItem("user", JSON.stringify(user));

  if (user?.preferredLanguage) {
    localStorage.setItem("preferredLanguage", String(user.preferredLanguage).toLowerCase());
  }

  document.cookie = `token=${token}; ${AUTH_COOKIE_PATH}; ${AUTH_COOKIE_MAX_AGE}`;
  document.cookie = `userRole=${user.role}; ${AUTH_COOKIE_PATH}; ${AUTH_COOKIE_MAX_AGE}`;
  dispatchUserUpdated();
}

export function persistUserProfile(user: User) {
  if (typeof window === "undefined") return;

  localStorage.setItem("user", JSON.stringify(user));

  if (user?.preferredLanguage) {
    localStorage.setItem("preferredLanguage", String(user.preferredLanguage).toLowerCase());
  }

  document.cookie = `userRole=${user.role}; ${AUTH_COOKIE_PATH}; ${AUTH_COOKIE_MAX_AGE}`;
  dispatchUserUpdated();
}

export function clearAuthSession() {
  if (typeof window === "undefined") return;

  localStorage.removeItem("token");
  localStorage.removeItem("user");
  document.cookie = `token=; ${AUTH_COOKIE_PATH}; ${EXPIRED_COOKIE_MAX_AGE}`;
  document.cookie = `userRole=; ${AUTH_COOKIE_PATH}; ${EXPIRED_COOKIE_MAX_AGE}`;
  dispatchUserUpdated();
}

export function getLoginRedirectPath(): string {
  if (typeof window === "undefined") return "/login";
  if (window.location.pathname.startsWith("/login")) return "/login";
  return `/login?redirect=${encodeURIComponent(window.location.pathname)}`;
}

export function getCurrentUserRawRole(): string | null {
  if (typeof window === "undefined") return null;

  const cookieRole = document.cookie
    .split(";")
    .map((part) => part.trim())
    .find((part) => part.startsWith("userRole="))
    ?.split("=")[1];

  if (cookieRole) {
    return decodeURIComponent(cookieRole);
  }

  const userStr = localStorage.getItem("user");
  if (!userStr) return null;

  try {
    const parsed = JSON.parse(userStr) as { role?: string };
    return parsed?.role || null;
  } catch {
    return null;
  }
}

export function logout() {
  if (typeof window === "undefined") return;

  clearAuthSession();
  window.location.href = "/login";
}

export function isAuthenticated(): boolean {
  if (typeof window === "undefined") return false;
  
  const token = localStorage.getItem("token");
  return !!token;
}

export function getCurrentUser(): User | null {
  if (typeof window === "undefined") return null;
  
  const userStr = localStorage.getItem("user");
  if (!userStr) return null;
  
  try {
    const parsed = JSON.parse(userStr) as User;
    const normalizedRole = normalizeRoleForAccess(parsed?.role);
    if (!normalizedRole) return parsed;

    return {
      ...parsed,
      role: normalizedRole,
    };
  } catch {
    return null;
  }
}
