/**
 * Système de gestion des permissions par rôle
 */

export type AccountType = 'advertiser' | 'agency' | 'broadcaster' | 'provider' | 'admin';
export type Feature = 
  | 'ads' 
  | 'ads:create' 
  | 'ads:edit' 
  | 'ads:delete'
  | 'ads:broadcast'
  | 'media'
  | 'screens' 
  | 'screens:create' 
  | 'screens:edit'
  | 'screens:manage'
  | 'screens:pool'
  | 'mediamap'
  | 'invoices'
  | 'clients'
  | 'clients:manage'
  | 'broadcasters'
  | 'broadcasters:manage'
  | 'team'
  | 'team:invite'
  | 'campaigns'
  | 'campaigns:create'
  | 'campaigns:manage'
  | 'templates'
  | 'templates:manage'
  | 'analytics'
  | 'earnings'
  | 'schedule'
  | 'providers'
  | 'admin:users'
  | 'admin:system';

/**
 * Définition des permissions par type de compte
 */
const PERMISSIONS: Record<AccountType, Feature[]> = {
  // Annonceur : peut créer/éditer/diffuser ses pubs, voir la mediamap et ses factures
  advertiser: [
    'ads',
    'ads:create',
    'ads:edit',
    'ads:delete',
    'ads:broadcast',
    'media',
    'mediamap',
    'campaigns',
    'campaigns:create',
    'campaigns:manage',
    'invoices',
    'analytics',
  ],
  // Agence : comme annonceur + gestion des clients
  agency: [
    'ads',
    'ads:create',
    'ads:edit',
    'ads:delete',
    'ads:broadcast',
    'media',
    'mediamap',
    'campaigns',
    'campaigns:create',
    'campaigns:manage',
    'invoices',
    'clients',
    'clients:manage',
    'team',
    'team:invite',
    'analytics',
  ],
  // Diffuseur : gère ses écrans (associés à des prestataires), planning, revenus
  broadcaster: [
    'screens',
    'screens:create',
    'screens:edit',
    'screens:manage',
    'providers',
    'schedule',
    'earnings',
    'analytics',
  ],
  // Prestataire : gère un pool d'écrans qui sont chez les diffuseurs
  provider: [
    'screens:pool',
    'broadcasters',
    'broadcasters:manage',
    'schedule',
    'analytics',
    'earnings',
  ],
  admin: [
    'ads',
    'ads:create',
    'ads:edit',
    'ads:delete',
    'screens',
    'screens:create',
    'screens:edit',
    'clients',
    'clients:manage',
    'team',
    'team:invite',
    'campaigns',
    'templates',
    'templates:manage',
    'analytics',
    'earnings',
    'schedule',
    'admin:users',
    'admin:system',
  ],
};

/**
 * Vérifie si un type de compte a accès à une fonctionnalité
 */
export function hasAccess(accountType: AccountType | undefined, feature: Feature): boolean {
  if (!accountType) return false;
  return PERMISSIONS[accountType]?.includes(feature) ?? false;
}

/**
 * Vérifie si un type de compte a accès à au moins une des fonctionnalités
 */
export function hasAnyAccess(accountType: AccountType | undefined, features: Feature[]): boolean {
  if (!accountType) return false;
  return features.some(feature => hasAccess(accountType, feature));
}

/**
 * Retourne toutes les fonctionnalités accessibles pour un type de compte
 */
export function getPermissions(accountType: AccountType | undefined): Feature[] {
  if (!accountType) return [];
  return PERMISSIONS[accountType] ?? [];
}

/**
 * Vérifie si un utilisateur est admin
 */
export function isAdmin(accountType: AccountType | undefined): boolean {
  return accountType === 'admin';
}

/**
 * Configuration des menus de navigation par rôle
 */
export interface MenuItem {
  label: string;
  href: string;
  icon?: string;
  feature: Feature;
  badge?: string;
}

export function getNavigationItems(accountType: AccountType | undefined): MenuItem[] {
  const items: MenuItem[] = [];

  // Menu Publicités (advertiser & agency)
  if (hasAccess(accountType, 'ads')) {
    items.push({
      label: 'Mes publicités',
      href: '/dashboard/ads',
      feature: 'ads',
    });
  }

  // Menu Campagnes (advertiser & agency)
  if (hasAccess(accountType, 'campaigns')) {
    items.push({
      label: 'Campagnes',
      href: '/dashboard/campaigns',
      feature: 'campaigns',
    });
  }

  // Menu Médiathèque (advertiser & agency)
  if (hasAccess(accountType, 'media')) {
    items.push({
      label: 'Médiathèque',
      href: '/dashboard/media',
      feature: 'media',
    });
  }

  // Menu MediaMap - Voir les écrans disponibles (advertiser & agency)
  if (hasAccess(accountType, 'mediamap')) {
    items.push({
      label: 'MediaMap',
      href: '/dashboard/map',
      feature: 'mediamap',
    });
  }

  // Menu Clients (agency only)
  if (hasAccess(accountType, 'clients')) {
    items.push({
      label: 'Clients',
      href: '/dashboard/clients',
      feature: 'clients',
    });
  }

  // Menu Équipe (agency only)
  if (hasAccess(accountType, 'team')) {
    items.push({
      label: 'Équipe',
      href: '/dashboard/team',
      feature: 'team',
    });
  }

  // Menu Mes Écrans (broadcaster only)
  if (hasAccess(accountType, 'screens')) {
    items.push({
      label: 'Mes écrans',
      href: '/dashboard/screens',
      feature: 'screens',
    });
  }

  // Menu Pool d'écrans (provider only) - Gérer le pool d'écrans chez les diffuseurs
  if (hasAccess(accountType, 'screens:pool')) {
    items.push({
      label: 'Pool d\'écrans',
      href: '/dashboard/screens',
      feature: 'screens:pool',
    });
  }

  // Menu Diffuseurs (provider only) - Gérer les diffuseurs où sont les écrans
  if (hasAccess(accountType, 'broadcasters')) {
    items.push({
      label: 'Diffuseurs',
      href: '/dashboard/broadcasters',
      feature: 'broadcasters',
    });
  }

  // Menu Prestataires (broadcaster only) - Associer les écrans aux prestataires
  if (hasAccess(accountType, 'providers')) {
    items.push({
      label: 'Prestataires',
      href: '/dashboard/providers',
      feature: 'providers',
    });
  }

  // Menu Planning (broadcaster & provider)
  if (hasAccess(accountType, 'schedule')) {
    items.push({
      label: 'Planning',
      href: '/dashboard/schedule',
      feature: 'schedule',
    });
  }

  // Menu Revenus (broadcaster & provider)
  if (hasAccess(accountType, 'earnings')) {
    items.push({
      label: 'Revenus',
      href: '/dashboard/earnings',
      feature: 'earnings',
    });
  }

  // Menu Factures (advertiser & agency)
  if (hasAccess(accountType, 'invoices')) {
    items.push({
      label: 'Facturation',
      href: '/dashboard/invoices',
      feature: 'invoices',
    });
  }

  // Menu Statistiques (tous)
  if (hasAccess(accountType, 'analytics')) {
    items.push({
      label: 'Statistiques',
      href: '/dashboard/stats',
      feature: 'analytics',
    });
  }

  // Menu Templates (admin only)
  if (hasAccess(accountType, 'templates:manage')) {
    items.push({
      label: 'Templates',
      href: '/dashboard/templates',
      feature: 'templates:manage',
    });
  }

  return items;
}
