/**
 * Utilitaires pour vérifier les permissions sur les playlists
 * T0485: Create Playlist Permission Frontend Checks
 */

import type { Playlist } from '../types';
import type { PlaylistCollaborator } from '../services/playlistService';

/**
 * Vérifie si un utilisateur est le propriétaire d'une playlist
 */
function isOwner(playlist: Playlist, userId: number | null | undefined): boolean {
  if (!userId) return false;
  return playlist.user_id === userId;
}

/**
 * Trouve le collaborateur pour un utilisateur donné dans une liste de collaborateurs
 */
function findCollaborator(
  collaborators: PlaylistCollaborator[] | undefined,
  userId: number | null | undefined
): PlaylistCollaborator | null {
  if (!userId || !collaborators) return null;
  return collaborators.find((c) => c.user_id === userId) || null;
}

/**
 * Vérifie si un utilisateur peut éditer une playlist
 * - Le propriétaire peut toujours éditer
 * - Les collaborateurs avec permission 'write' ou 'admin' peuvent éditer
 */
export function canEdit(
  playlist: Playlist,
  userId: number | null | undefined,
  collaborators?: PlaylistCollaborator[]
): boolean {
  if (!userId) return false;

  // Le propriétaire peut toujours éditer
  if (isOwner(playlist, userId)) {
    return true;
  }

  // Vérifier si l'utilisateur est collaborateur avec permission write ou admin
  const collaborator = findCollaborator(collaborators, userId);
  if (!collaborator) return false;

  return collaborator.permission === 'write' || collaborator.permission === 'admin';
}

/**
 * Vérifie si un utilisateur peut supprimer une playlist
 * - Seul le propriétaire peut supprimer
 */
export function canDelete(
  playlist: Playlist,
  userId: number | null | undefined
): boolean {
  if (!userId) return false;
  return isOwner(playlist, userId);
}

/**
 * Vérifie si un utilisateur peut ajouter des tracks à une playlist
 * - Le propriétaire peut toujours ajouter
 * - Les collaborateurs avec permission 'write' ou 'admin' peuvent ajouter
 */
export function canAddTracks(
  playlist: Playlist,
  userId: number | null | undefined,
  collaborators?: PlaylistCollaborator[]
): boolean {
  if (!userId) return false;

  // Le propriétaire peut toujours ajouter
  if (isOwner(playlist, userId)) {
    return true;
  }

  // Vérifier si l'utilisateur est collaborateur avec permission write ou admin
  const collaborator = findCollaborator(collaborators, userId);
  if (!collaborator) return false;

  return collaborator.permission === 'write' || collaborator.permission === 'admin';
}

/**
 * Vérifie si un utilisateur peut retirer des tracks d'une playlist
 * - Le propriétaire peut toujours retirer
 * - Les collaborateurs avec permission 'write' ou 'admin' peuvent retirer
 */
export function canRemoveTracks(
  playlist: Playlist,
  userId: number | null | undefined,
  collaborators?: PlaylistCollaborator[]
): boolean {
  if (!userId) return false;

  // Le propriétaire peut toujours retirer
  if (isOwner(playlist, userId)) {
    return true;
  }

  // Vérifier si l'utilisateur est collaborateur avec permission write ou admin
  const collaborator = findCollaborator(collaborators, userId);
  if (!collaborator) return false;

  return collaborator.permission === 'write' || collaborator.permission === 'admin';
}

/**
 * Vérifie si un utilisateur peut gérer les collaborateurs d'une playlist
 * - Seul le propriétaire peut gérer les collaborateurs
 */
export function canManageCollaborators(
  playlist: Playlist,
  userId: number | null | undefined
): boolean {
  if (!userId) return false;
  return isOwner(playlist, userId);
}

/**
 * Vérifie si un utilisateur peut lire une playlist
 * - Le propriétaire peut toujours lire
 * - Si la playlist est publique, tout le monde peut la lire
 * - Les collaborateurs avec n'importe quelle permission peuvent lire
 */
export function canRead(
  playlist: Playlist,
  userId: number | null | undefined,
  collaborators?: PlaylistCollaborator[]
): boolean {
  // Le propriétaire peut toujours lire
  if (isOwner(playlist, userId)) {
    return true;
  }

  // Si la playlist est publique, tout le monde peut la lire
  if (playlist.is_public) {
    return true;
  }

  // Vérifier si l'utilisateur est collaborateur (n'importe quelle permission)
  if (userId) {
    const collaborator = findCollaborator(collaborators, userId);
    if (collaborator) {
      return true;
    }
  }

  return false;
}

