﻿'use client';

const AUTH_STORAGE_EVENT = 'auth-storage-changed';

export interface StoredUser {
  id: number;
  username: string;
  nombre: string;
  rol: string;
  permissions?: Record<string, 'none' | 'read' | 'write'>;
}

export interface AuthSession {
  accessToken: string | null;
  refreshToken: string | null;
  user: StoredUser | null;
}

function emitAuthStorageChange() {
  if (typeof window !== 'undefined') {
    window.dispatchEvent(new Event(AUTH_STORAGE_EVENT));
  }
}

export function redirectToLogin() {
  if (typeof window === 'undefined') {
    return;
  }

  if (window.location.pathname !== '/') {
    window.location.replace('/');
  }
}

export function readAuthSession(): AuthSession {
  if (typeof window === 'undefined') {
    return { accessToken: null, refreshToken: null, user: null };
  }

  const rawUser = localStorage.getItem('user');

  return {
    accessToken: localStorage.getItem('token'),
    refreshToken: localStorage.getItem('refreshToken'),
    user: rawUser ? (JSON.parse(rawUser) as StoredUser) : null,
  };
}

export function setAuthSession(session: AuthSession) {
  if (typeof window === 'undefined') {
    return;
  }

  if (session.accessToken) {
    localStorage.setItem('token', session.accessToken);
  } else {
    localStorage.removeItem('token');
  }

  if (session.refreshToken) {
    localStorage.setItem('refreshToken', session.refreshToken);
  } else {
    localStorage.removeItem('refreshToken');
  }

  if (session.user) {
    localStorage.setItem('user', JSON.stringify(session.user));
  } else {
    localStorage.removeItem('user');
  }

  emitAuthStorageChange();
}

export function clearAuthSession(options?: { redirectToLogin?: boolean }) {
  if (typeof window === 'undefined') {
    return;
  }

  localStorage.removeItem('token');
  localStorage.removeItem('refreshToken');
  localStorage.removeItem('user');
  emitAuthStorageChange();

  if (options?.redirectToLogin) {
    redirectToLogin();
  }
}

export function subscribeToAuthSession(callback: (session: AuthSession) => void) {
  if (typeof window === 'undefined') {
    return () => undefined;
  }

  const handleChange = () => callback(readAuthSession());

  window.addEventListener(AUTH_STORAGE_EVENT, handleChange);
  window.addEventListener('storage', handleChange);

  return () => {
    window.removeEventListener(AUTH_STORAGE_EVENT, handleChange);
    window.removeEventListener('storage', handleChange);
  };
}
