import 'package:flutter/material.dart';
import '../data/session/session_storage.dart';
import '../models/models.dart';
import '../services/login_service.dart';
import '../services/services.dart';
import 'package:bcrypt/bcrypt.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;

  bool get isLoading => _isLoading;
  bool get obscureText => _obscureText;

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

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

      List<Usuario> usuarios = await RepoService<Usuario>().obtenerTodos();
      Usuario? usuario = usuarios.firstWhere(
        (usuario) => usuario.correo?.toLowerCase() == correo.toLowerCase(),
        orElse: () => Usuario(),
      );

      if (usuario.id != 0 && usuario.clave != null) {
        bool esContrasenaValida = BCrypt.checkpw(contrasena, usuario.clave!);

        if (esContrasenaValida) {
          _status = Status.authenticated;
          _errores = null;
          _idUsuario = usuario.id;
          await SessionStorage().saveId(_idUsuario!);
          notifyListeners();
        } else {
          _errores = {'contrasena': 'Contraseña incorrecta'};
          _status = Status.unauthenticated;
          notifyListeners();
        }
      } else {
        _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;
    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();
  }
}
