import 'package:flutter/material.dart';
import '../data/session/session_storage.dart'; // Asegúrate de importar SessionStorage
import '../models/models.dart';
import '../services/login_service.dart';
import '../services/services.dart';

enum Status { uninitialized, authenticated, authenticating, unauthenticated }

class LoginViewModel extends ChangeNotifier {
  Status _status = Status.uninitialized;
  Status get status => _status;
  bool hasErrors = false;
  Map<String, dynamic>? _errores = {};
  bool _obscureText = true;
  Usuario? _usuario;
  int? _idUsuario;
  bool _isLoading = true; // Indica si está verificando la sesión

  bool get isLoading => _isLoading; // Getter para el estado de carga

  // Getters
  Usuario? get usuario => _usuario;
  Map<String, dynamic>? get errores => _errores;

  Future<void> login(String correo) async {
    try {
      print("Iniciando proceso de login para: $correo");

      List<Usuario> usuarios = await RepoService<Usuario>().obtenerTodos();
      print("Usuarios obtenidos de la base de datos: ${usuarios.length}");

      Usuario? usuario = usuarios.firstWhere(
        (usuario) => usuario.correo?.toLowerCase() == correo.toLowerCase(),
        orElse: () => Usuario(),
      );

      // Si el correo es válido
      if (usuario.id != 0) {
        print("Usuario encontrado: ${usuario.correo}, ID: ${usuario.id}");
        _status = Status.authenticated;
        _errores = null;
        _idUsuario = usuario.id;

        // Guardar el id del usuario en SessionStorage
        await SessionStorage().saveId(_idUsuario!);
        print("ID guardado en SharedPreferences: $_idUsuario");

        notifyListeners();
      } else {
        print("Correo no válido: $correo");
        hasErrors = true;
        _errores = {'correo': 'El correo no existe en el sistema'};
        _status = Status.unauthenticated;
        notifyListeners();
      }
    } catch (e) {
      print("Error durante el proceso de login: $e");
      _status = Status.unauthenticated;
      notifyListeners();
    }
  }

  Future<void> checkSession() async {
    _isLoading = true; // Inicia el estado de carga
    notifyListeners();

    int? idUsuarioGuardado = await SessionStorage().getId();
    if (idUsuarioGuardado != null) {
      print("Sesión encontrada para el ID de usuario: $idUsuarioGuardado");
      _idUsuario = idUsuarioGuardado;
      _status = Status.authenticated;
    } else {
      print("No se encontró ninguna sesión activa.");
      _status = Status.unauthenticated;
    }

    _isLoading = false; // Termina el estado de carga
    notifyListeners();
  }

  void logOut() async {
    print("Cerrando sesión...");
    _usuario = null;
    _idUsuario = null;
    _status = Status.unauthenticated;
    _errores = {};

    await SessionStorage().clearId();
    print("ID de usuario eliminado de SharedPreferences.");
    notifyListeners();
  }

  void showPassword() {
    _obscureText = !_obscureText;
    notifyListeners();
  }
}
