import 'dart:convert';

import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import '/models/toping_categoria_model.dart';

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

class TopingViewModel extends ChangeNotifier {
  String _busqueda = "";
  String get busqueda => _busqueda;

  List<Toping> _registros = [];
  Toping? _selectedModelo;
  bool _isLoading = false;

  List<Toping> get registros => _registros;
  Toping? get selectedToping => _selectedModelo;
  bool get isLoading => _isLoading;

  int pagina = 1;
  int totalPaginas = 1;
  int limite = 10;

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

  Toping? getById(int id) {
    try {
      return _registros.firstWhere((toping) => toping.id == id);
    } catch (e) {
      // Si no se encuentra ninguna categoría con ese ID, regresa null.
      return null;
    }
  }

  Future<List<Toping>> fetchRegistros(
      {String? q, bool segmentar = false, int limitee = 10}) async {
    Map<String, String> parametros = {
      "ordenar": "id-desc",
      "pagina": "$pagina",
      "limite": "$limite",
      "expand": "mediaToping,categoriaToping"
    };
    if (limitee == -1) {
      parametros['limite'] = limitee.toString();
    }
    if (_busqueda.isNotEmpty) {
      parametros["q"] = _busqueda;
    }
    if (segmentar) {
      parametros['segmentar'] = "1";
    }
    var r = ApiResponse(
        await BaseService().get("admin/toping", queryParameters: parametros));
    pagina = r.paginacion!.pagina;
    var total = r.paginacion!.total / r.paginacion!.limite;
    totalPaginas = total > 0 ? total.ceil() : 1;
    List<Toping> aux = [];
    if (r.isOk) {
      for (var x in r.resultados!) {
        Toping modelo = Toping.fromJson(x);
        aux.add(modelo);
      }
    }
    _registros = aux;
    notifyListeners();
    return _registros;
  }

  selectModelo(Toping Toping) {
    _selectedModelo = Toping;
    notifyListeners();
  }

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

  cambiarPagina(int nuevaPagina, {bool segmentar = false}) {
    pagina = nuevaPagina;
    fetchRegistros(segmentar: segmentar);
  }

  Future eliminarMedia(Media m) async {
    _selectedModelo!.mediaToping
        .removeWhere((mediaToping) => mediaToping.media?.id == m.id);
    notifyListeners();
  }

  Future<void> guardarModelo({
    required Toping modelo,
    required String clave,
    required String nombre,
    required String descripcion,
    required String costo,
    required int categoria,
    required bool activo,
    List<XFile>? fotos,
  }) async {
    modelo.clave = clave;
    modelo.nombre = nombre;
    modelo.descripcion = descripcion;
    modelo.idCategoria = categoria;
    modelo.costo = costo;
    modelo.activo = activo;
    var r = ApiResponse(await BaseService()
        .post("admin/toping/guardar", body: modelo.toJson()));
    int id = int.parse(r.detalle!["id"].toString());
    if (id > 0 && fotos != null && fotos.isNotEmpty) {
      for (var x in fotos) {
        await GeneralService().enviarMedia(
            id: id,
            media: x,
            modulo: "Toping",
            etiquetaID: "idToping",
            tipo: "imagen");
      }
    }
    var s =
        await BaseService().post("admin/toping/guardar", body: modelo.toJson());
    if (r.statusCode == 200) {}
    notifyListeners();
  }

  Future<void> eliminar(Toping m) async {
    var r = await BaseService()
        .delete("admin/toping", body: {"id": m.id.toString()});
    Map<String, dynamic> resJson = jsonDecode(r.body);
    if (r.statusCode == 200) {}
  }
}
