import 'package:flutter_riverpod/flutter_riverpod.dart';

import '../../features/auth/data/auth_repository.dart';
import '../../features/auth/data/auth_repository_firebase.dart';
import '../../features/auth/data/auth_repository_http.dart';
import '../../features/boloes/data/boloes_repository.dart';
import '../../features/boloes/data/boloes_repository_firebase.dart';
import '../../features/boloes/data/boloes_repository_http.dart';
import '../../features/boloes/data/ciclo_vida_repository.dart';
import '../../features/boloes/data/ciclo_vida_repository_firebase.dart';
import '../../features/boloes/data/ciclo_vida_repository_http.dart';
import '../../features/boloes/data/participantes_repository.dart';
import '../../features/boloes/data/participantes_repository_firebase.dart';
import '../../features/boloes/data/participantes_repository_http.dart';
import '../../features/boloes/data/ranking_repository.dart';
import '../../features/boloes/data/ranking_repository_firebase.dart';
import '../../features/boloes/data/ranking_repository_http.dart';
import '../api/api_client.dart';
import '../sessao/sessao_store.dart';
import 'relogio.dart';

/// Qual backend o app usa — **configuração, não código comentado**.
///
/// O padrão é o Firebase, que é para onde a fase 2 está indo. O HTTP continua
/// alcançável por `--dart-define=BACKEND=http` até `MG-8` verificar a paridade:
/// enquanto ela não passa, poder voltar é o que separa "trocamos de backend" de
/// "ficamos sem backend".
///
/// ```
/// flutter run --dart-define=BACKEND=http --dart-define=API_URL=http://10.0.2.2:3000
/// ```
const _backend = String.fromEnvironment('BACKEND', defaultValue: 'firebase');

bool get usandoFirebase => _backend != 'http';

final sessaoStoreProvider = Provider<SessaoStore>((_) => SessaoStore());

final apiClientProvider = Provider<ApiClient>(
  (ref) => ApiClient(ref.watch(sessaoStoreProvider)),
);

/// Relógio do servidor, medido uma vez por sessão (`PP-3`).
final relogioProvider = Provider<RelogioDoServidor>((_) => RelogioDoServidor());

final authRepositoryProvider = Provider<AuthRepository>(
  (ref) => usandoFirebase
      ? AuthRepositoryFirebase(ref.watch(sessaoStoreProvider))
      : AuthRepositoryHttp(
          ref.watch(apiClientProvider),
          ref.watch(sessaoStoreProvider),
        ),
);

final boloesRepositoryProvider = Provider<BoloesRepository>(
  (ref) => usandoFirebase
      ? BoloesRepositoryFirebase(ref.watch(relogioProvider))
      : BoloesRepositoryHttp(ref.watch(apiClientProvider)),
);

final rankingRepositoryProvider = Provider<RankingRepository>(
  (ref) => usandoFirebase
      ? RankingRepositoryFirebase()
      : RankingRepositoryHttp(ref.watch(apiClientProvider)),
);

final participantesRepositoryProvider = Provider<ParticipantesRepository>(
  (ref) => usandoFirebase
      ? ParticipantesRepositoryFirebase()
      : ParticipantesRepositoryHttp(ref.watch(apiClientProvider)),
);

final cicloVidaRepositoryProvider = Provider<CicloVidaRepository>(
  (ref) => usandoFirebase
      ? CicloVidaRepositoryFirebase()
      : CicloVidaRepositoryHttp(ref.watch(apiClientProvider)),
);
