import 'dart:convert';

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

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

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

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

  List<TopingCategoria> get registros => _registros;
  TopingCategoria? get selectedTopingCategoria => _selectedModelo;
  bool get isLoading => _isLoading;

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

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

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

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

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

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

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

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

  Future<void> guardarModelo({
    required TopingCategoria modelo,
    required String clave,
    required String nombre,
    required String descripcion,
    List<XFile>? fotos,
  }) async {
    modelo.clave = clave;
    modelo.nombre = nombre;
    modelo.descripcion = descripcion;
    var r = ApiResponse(await BaseService()
        .post("admin/toping-categoria", 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: "Autotanque",
            etiquetaID: "idInspeccion",
            tipo: "imagen");
      }
    }
    var s = await BaseService()
        .post("admin/toping-categoria/guardar", body: modelo.toJson());
    if (r.statusCode == 200) {}
    notifyListeners();
  }

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