import 'dart:convert';

import 'package:flutter_secure_storage/flutter_secure_storage.dart';

/// Guarda os tokens de sessão em armazenamento seguro do device.
///
/// A sessão persistente deixou de ser conveniência e passou a ser a única
/// proteção prática do participante: como não existe recuperação de senha nesta
/// versão, sessão que cai sozinha custa uma conta perdida (PRD identificação).
class SessaoStore {
  SessaoStore([FlutterSecureStorage? storage])
    : _storage = storage ?? const FlutterSecureStorage();

  final FlutterSecureStorage _storage;

  static const _chaveAccess = 'bolao.accessToken';
  static const _chaveRefresh = 'bolao.refreshToken';
  static const _chaveConta = 'bolao.conta';

  Future<void> salvar({
    required String accessToken,
    required String refreshToken,
  }) async {
    await _storage.write(key: _chaveAccess, value: accessToken);
    await _storage.write(key: _chaveRefresh, value: refreshToken);
  }

  Future<String?> get accessToken => _storage.read(key: _chaveAccess);
  Future<String?> get refreshToken => _storage.read(key: _chaveRefresh);

  /// Guarda o mínimo da conta para o cold start **sem rede** não jogar o
  /// participante no login. Sem recuperação de senha nesta versão, deslogar por
  /// rede ruim é caro: ele pode não lembrar o cadastro e perder o histórico.
  Future<void> salvarConta(Map<String, dynamic> conta) =>
      _storage.write(key: _chaveConta, value: jsonEncode(conta));

  Future<Map<String, dynamic>?> get conta async {
    final bruto = await _storage.read(key: _chaveConta);
    if (bruto == null) return null;
    try {
      return jsonDecode(bruto) as Map<String, dynamic>;
    } on FormatException {
      return null;
    }
  }

  /// Logout: limpa tudo. Também é chamado quando a sessão é invalidada pelo
  /// servidor, para o app não insistir com credencial morta.
  Future<void> limpar() async {
    await _storage.delete(key: _chaveAccess);
    await _storage.delete(key: _chaveRefresh);
    await _storage.delete(key: _chaveConta);
  }
}
