import 'dart:convert';

import 'package:flutter/material.dart';

import '../models/models.dart';
import '../services/base_service.dart';

class UsuariosViewModel extends ChangeNotifier {
  String _busqueda = "";
  String get busqueda => _busqueda;
  List<Usuario> _registros = [];
  List<Usuario> get registros => _registros;
  Usuario? _selectedModelo;
  Usuario? get selectedModelo => _selectedModelo;
  bool _isLoading = false;
  bool get isLoading => _isLoading;

  Map<String, bool> _selectedPermisos = {};
  Map<String, bool> get selectedPermisos => _selectedPermisos;

  Future<void> fetchRegistros() async {
    Map<String, String> parametros = {
      "ordenar": "id-desc",
      "expand": "empresas"
    };
    if (_busqueda.isNotEmpty) {
      parametros = {
        "ordenar": "id-desc",
        "limite": "-1",
        "q": _busqueda,
        "expand": "empresas"
      };
    }
    var r =
        await BaseService().get("admin/usuario", queryParameters: parametros);
    Map<String, dynamic> resJson = jsonDecode(r.body);
    try {
      List<Usuario> aux = [];
      if (r.statusCode == 200) {
        for (var x in resJson['resultado']) {
          Usuario modelo = Usuario.fromJson(x);
          aux.add(modelo);
        }
      }
      _registros = aux;
      notifyListeners();
    } catch (e) {
      print(e);
    }
  }

  Future<void> cargarPermisosUsuario(int usuarioId) async {
    setIsLoading(true);
    try {
      var response = await BaseService().get("admin/usuario",
          queryParameters: {'expand': 'permisos', 'id': '$usuarioId'});
      Map<String, dynamic> resJson = jsonDecode(response.body);

      List<dynamic> permisosUsuario = resJson['resultado'][0]['permisos'];
      Map<String, bool> permisosActualizados = {};

      for (var permiso in permisosUsuario) {
        String permisoId = permiso.toString();
        permisosActualizados[permisoId] = true;
      }

      _selectedPermisos = permisosActualizados;
      // print(_selectedPermisos);
      notifyListeners(); // Avisar a los widgets que escuchan sobre el cambio
    } catch (e) {
      print("Error al cargar los permisos del usuario: $e");
    } finally {
      setIsLoading(false);
    }
  }

  void setSelectedPermisos(Map<String, bool> permisos) {
    _selectedPermisos = permisos;
    notifyListeners();
  }

  Future<void> guardarModelo({
    required Usuario modelo,
    required String nombre,
    required String correo,
    required String telefono,
  }) async {
    //?TEMPORAL
    modelo.nombre = nombre;
    modelo.correo = correo;
    modelo.telefono = telefono;
    modelo.creado = DateTime.now();
    notifyListeners();
  }

  Future<void> guardarUsuario({
    required Usuario modelo,
    required String nombre,
    required String correo,
    required List<String> permisosSeleccionados,
  }) async {
    setIsLoading(true);
    try {
      var requestBody = {
        'nombre': nombre,
        'correo': correo,
        'permisos': permisosSeleccionados,
      };

      if (modelo.id != null) {
        requestBody['id'] = modelo.id;
      }

      var r =
          await BaseService().post("admin/usuario/guardar", body: requestBody);
      if (r.statusCode == 200) {
        print('Usuario guardado exitosamente');
      } else {
        throw Exception('Error al guardar el usuario: ${r.statusCode}');
      }
    } catch (e) {
      print('Error al guardar el usuario: $e');
    } finally {
      setIsLoading(false);
    }
  }

  bool validarUsuario({
    required String nombre,
    required String correo,
  }) {
    if (nombre.isEmpty || correo.isEmpty) {
      return false;
    }
    return true;
  }

  setIsLoading(bool loading) {
    _isLoading = loading;
    notifyListeners();
  }

  selectUsuario(Usuario? usuario) {
    _selectedModelo = usuario;
    notifyListeners();
  }

  setBusqueda(String value) {
    _busqueda = value;
    notifyListeners();
  }

  Future usuarioEmpresa(int idUsuario, String idEmpresa) async {
    var r = await BaseService().post("admin/usuario/usuario-empresa",
        body: {"idUsuario": idUsuario, "idEmpresa": idEmpresa});
    if (r.statusCode == 200) {}
  }
}
