/// Fichier contenant toutes les constantes utilisées dans l'application
/// Centralise les clés, noms de boîtes Hive, et autres constantes
/// pour faciliter la maintenance et éviter les erreurs de frappe
library;

import 'package:flutter/foundation.dart' show kIsWeb, debugPrint;
import 'package:flutter/material.dart';

class AppKeys {
  // Noms des boîtes Hive
  static const String userBoxName = 'user';
  static const String amicaleBoxName = 'amicale';
  static const String clientsBoxName = 'clients';
  static const String operationsBoxName = 'operations';
  static const String sectorsBoxName = 'sectors';
  static const String passagesBoxName = 'passages';
  static const String settingsBoxName = 'settings';
  static const String membresBoxName = 'membres';
  static const String userSectorBoxName = 'user_sector';
  static const String chatRoomsBoxName = 'chat_rooms';
  static const String chatMessagesBoxName = 'chat_messages';
  static const String regionsBoxName = 'regions';
  static const String pendingRequestsBoxName = 'pending_requests';
  static const String tempEntitiesBoxName = 'temp_entities';

  // Rôles utilisateurs
  static const int roleUser = 1;
  static const int roleAdmin1 = 2;
  static const int roleAdmin2 = 4;
  static const int roleAdmin3 = 9;

  // URLs API pour les différents environnements
  static const String baseApiUrlDev = 'https://dapp.geosector.fr/api';
  static const String baseApiUrlRec = 'https://rapp.geosector.fr/api';
  static const String baseApiUrlProd = 'https://app3.geosector.fr/api';

  // Identifiants d'application pour les différents environnements
  static const String appIdentifierDev = 'dapp.geosector.fr';
  static const String appIdentifierRec = 'rapp.geosector.fr';
  static const String appIdentifierProd = 'app3.geosector.fr';

  // Endpoints API
  static const String loginEndpoint = '/login';
  static const String logoutEndpoint = '/logout';
  static const String registerEndpoint = '/register';
  static const String syncDataEndpoint = '/data/sync';
  static const String sectorsEndpoint = '/sectors';

  // Durées
  static const Duration connectionTimeout = Duration(seconds: 15);
  static const Duration receiveTimeout = Duration(seconds: 30);
  static const Duration sessionDefaultExpiry = Duration(days: 7);

  // Clés API externes
  static const String mapboxApiKeyDev =
      'pk.eyJ1IjoicHZkNnNvZnQiLCJhIjoiY21hanVmNjN5MTM5djJtczdsMW92cjQ0ciJ9.pUCMuvWPB3cuBaPh4ywTAw';
  static const String mapboxApiKeyRec =
      'pk.eyJ1IjoicHZkNnNvZnQiLCJhIjoiY21hanVlZ3FiMGx0NDJpc2k4YnkxaWZ2dSJ9.OqGJtjlWRgB4fIjECCB8WA';
  static const String mapboxApiKeyProd =
      'pk.eyJ1IjoicHZkNnNvZnQiLCJhIjoiY204dTNhNmd0MGV1ZzJqc2pnNnB0NjYxdSJ9.TA5Mvliyn91Oi01F_2Yuxw';

  // Méthode pour obtenir la clé API Mapbox en fonction de l'environnement actuel
  static String getMapboxApiKey(String environment) {
    // Utiliser l'environnement passé en paramètre pour déterminer quelle clé retourner
    switch (environment) {
      case 'DEV':
        return mapboxApiKeyDev;
      case 'REC':
        return mapboxApiKeyRec;
      case 'PROD':
      default:
        return mapboxApiKeyProd;
    }
  }

  // Pour la compatibilité avec le code existant, on garde un getter qui utilise
  // l'environnement actuel (à utiliser uniquement si l'ApiService n'est pas disponible)
  static String get mapboxApiKey {
    // Note: Cette implémentation est une solution de secours et devrait être évitée
    // Il est préférable d'utiliser getMapboxApiKey(apiService.getCurrentEnvironment())

    // Détection basique de l'environnement basée sur l'URL en mode web
    if (kIsWeb) {
      // Essayer d'accéder à l'URL actuelle (fonctionne uniquement en mode web)
      try {
        final String currentUrl = Uri.base.toString().toLowerCase();

        if (currentUrl.contains('app.geo.dev')) {
          return mapboxApiKeyDev;
        } else if (currentUrl.contains('rapp.geosector.fr')) {
          return mapboxApiKeyRec;
        }
      } catch (e) {
        // En cas d'erreur, utiliser la clé de production par défaut
        debugPrint('Erreur lors de la détection de l\'environnement: $e');
      }
    }

    // Par défaut, retourner la clé de production
    return mapboxApiKeyProd;
  }

  // Headers
  static const String sessionHeader = 'Authorization';

  // En-têtes par défaut pour les requêtes API
  // Note: Ces en-têtes seront complétés dynamiquement dans ApiService
  static const Map<String, String> defaultHeaders = {
    'Content-Type': 'application/json',
    'X-Client-Type': kIsWeb ? 'web' : 'mobile',
    'Accept': 'application/json',
  };

  // Civilités
  static const Map<int, String> civilites = {
    1: 'M.',
    2: 'Mme',
  };

  // Types de règlements (basés sur la maquette Figma)
  static const Map<int, Map<String, dynamic>> typesReglements = {
    1: {
      'titre': 'Espèce',
      'couleur': 0xFFDAA520, // Goldenrod
      'icon_data': Icons.payments_outlined,
    },
    2: {
      'titre': 'Chèque',
      'couleur': 0xFF7E57C2, // Violet foncé (Material Design Deep Purple 400)
      'icon_data': Icons.account_balance_wallet_outlined,
    },
    3: {
      'titre': 'CB',
      'couleur': 0xFF0099FF, // Bleu flashy
      'icon_data': Icons.credit_card,
    },
    4: {
      'titre': 'Non renseigné',
      'couleur': 0xFF9E9E9E, // Gris moyen
      'icon_data': Icons.help_outline,
    },
  };

  // Types de passages (basés sur la maquette Figma)
  static const Map<int, Map<String, dynamic>> typesPassages = {
    1: {
      'titres': 'Effectués',
      'titre': 'Effectué',
      'couleur1': 0xFF008000, // Vert foncé
      'couleur2': 0xFF008000, // Vert foncé
      'couleur3': 0xFF008000, // Vert foncé
      'icon_data': Icons.task_alt,
    },
    2: {
      'titres': 'À finaliser',
      'titre': 'À finaliser',
      'couleur1': 0xFFFFFFFF, // Blanc (nbPassages=0)
      'couleur2': 0xFFFFB978, // Orange moyen (nbPassages=1)
      'couleur3': 0xFFE66F00, // Orange foncé (nbPassages>1)
      'icon_data': Icons.refresh,
    },
    3: {
      'titres': 'Refusés',
      'titre': 'Refusé',
      'couleur1': 0xFFE41B13, // Rouge (Figma)
      'couleur2': 0xFFE41B13, // Rouge (Figma)
      'couleur3': 0xFFE41B13, // Rouge (Figma)
      'icon_data': Icons.block,
    },
    4: {
      'titres': 'Dons',
      'titre': 'Don',
      'couleur1': 0xFF00BCD4, // Cyan
      'couleur2': 0xFF00BCD4, // Cyan
      'couleur3': 0xFF00BCD4, // Cyan
      'icon_data': Icons.volunteer_activism,
    },
    5: {
      'titres': 'Lots',
      'titre': 'Lot',
      'couleur1': 0xFF20335E, // Bleu foncé (Figma)
      'couleur2': 0xFF20335E, // Bleu foncé (Figma)
      'couleur3': 0xFF20335E, // Bleu foncé (Figma)
      'icon_data': Icons.layers,
    },
    6: {
      'titres': 'Maisons vides',
      'titre': 'Maison vide',
      'couleur1': 0xFF757575, // Gris foncé (Material Design 600)
      'couleur2': 0xFF757575, // Gris foncé (Material Design 600)
      'couleur3': 0xFF757575, // Gris foncé (Material Design 600)
      'icon_data': Icons.home_outlined,
    },
  };
}
