import 'package:injectable/injectable.dart';
import 'package:unionflow_mobile_apps/core/network/api_client.dart';
import 'package:unionflow_mobile_apps/core/utils/logger.dart';
import '../models/seuil_lcb_ft_model.dart';

/// Repository pour les paramètres LCB-FT (seuils anti-blanchiment).
/// Endpoints: GET /api/parametres-lcb-ft, GET /api/parametres-lcb-ft/seuil-justification
@lazySingleton
class ParametresLcbFtRepository {
  final ApiClient _apiClient;
  static const String _base = '/api/parametres-lcb-ft';

  ParametresLcbFtRepository(this._apiClient);

  /// Récupère uniquement le seuil de justification (endpoint léger).
  /// Paramètres optionnels : organisationId, codeDevise (XOF par défaut).
  /// Retourne le seuil par défaut (500k XOF) en cas d'erreur.
  Future<SeuilLcbFtModel> getSeuilJustification({
    String? organisationId,
    String codeDevise = 'XOF',
  }) async {
    try {
      final queryParams = <String, dynamic>{};
      if (organisationId != null && organisationId.isNotEmpty) {
        queryParams['organisationId'] = organisationId;
      }
      queryParams['codeDevise'] = codeDevise;

      final response = await _apiClient.get(
        '$_base/seuil-justification',
        queryParameters: queryParams,
      );

      if (response.statusCode == 200 && response.data != null) {
        return SeuilLcbFtModel.fromJson(response.data as Map<String, dynamic>);
      }

      AppLogger.warning(
        'ParametresLcbFtRepository: getSeuilJustification status ${response.statusCode}, fallback au seuil par défaut',
      );
      return SeuilLcbFtModel.defaultSeuil();
    } catch (e, st) {
      AppLogger.error(
        'ParametresLcbFtRepository: getSeuilJustification échoué, fallback au seuil par défaut',
        error: e,
        stackTrace: st,
      );
      return SeuilLcbFtModel.defaultSeuil();
    }
  }

  /// Récupère les paramètres LCB-FT complets (tous les seuils + config).
  /// Pour usage admin ou affichage détaillé.
  Future<Map<String, dynamic>?> getParametres({
    String? organisationId,
    String codeDevise = 'XOF',
  }) async {
    try {
      final queryParams = <String, dynamic>{};
      if (organisationId != null && organisationId.isNotEmpty) {
        queryParams['organisationId'] = organisationId;
      }
      queryParams['codeDevise'] = codeDevise;

      final response = await _apiClient.get(_base, queryParameters: queryParams);

      if (response.statusCode == 200 && response.data != null) {
        return response.data as Map<String, dynamic>;
      }

      AppLogger.warning(
        'ParametresLcbFtRepository: getParametres status ${response.statusCode}',
      );
      return null;
    } catch (e, st) {
      AppLogger.error(
        'ParametresLcbFtRepository: getParametres échoué',
        error: e,
        stackTrace: st,
      );
      return null;
    }
  }
}
