// ignore_for_file: use_build_context_synchronously

import 'package:camera/camera.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import '/views/home/home_screen.dart';
import '/widgets/widgets.dart';
import 'package:provider/provider.dart';

import '../../models/models.dart';
import '../../viewmodels/viewmodels.dart';

class TopingCategoriaForm extends StatefulWidget {
  const TopingCategoriaForm({Key? key}) : super(key: key);

  @override
  State<TopingCategoriaForm> createState() => Formulario();
}

class Formulario extends State<TopingCategoriaForm> {
  final _clave = TextEditingController();
  final _nombre = TextEditingController();
  final _descripcion = TextEditingController();
  final _imagen = TextEditingController();

  @override
  void initState() {
    super.initState();
    Future(() async {
      Provider.of<TopingCategoriaViewModel>(context, listen: false)
          .setIsLoading(true);
      final mvm = Provider.of<TopingCategoriaViewModel>(context, listen: false);
      TopingCategoria? modelo = mvm.selectedTopingCategoria;
      if (modelo != null && modelo.id > 0) {
        setState(() {
          _clave.text = modelo.clave.toString();
          _nombre.text = modelo.nombre.toString();
          _descripcion.text = modelo.descripcion.toString();
        });
      }
      Provider.of<TopingCategoriaViewModel>(context, listen: false)
          .setIsLoading(false);
    });
  }

  @override
  void dispose() {
    super.dispose();
    _descripcion.dispose();
    _nombre.dispose();
  }

  @override
  Widget build(BuildContext context) {
    final mvm = Provider.of<TopingCategoriaViewModel>(context);
    final modelo = mvm.selectedTopingCategoria;
    final mediavm = Provider.of<MediaViewModel>(context);
    if (mvm.isLoading) return const Cargando();
    final TopingCategoria = mvm.selectedTopingCategoria;

    List<Widget> _registros = [];
    if (modelo!.mediaTopingCategoria.isNotEmpty) {
      for (int x = 0; x <= modelo.mediaTopingCategoria.length - 1; x++) {
        _registros.add(itemMedia(context, x));
      }
    }
    Size s = MediaQuery.of(context).size;
    int axiscount = obtenerAxiscount(s);

    return Scaffold(
      appBar: encabezado(titulo: "Toping Categoria"),
      body: SingleChildScrollView(
        padding: const EdgeInsets.all(8),
        child: Column(
          children: [
            tarjeta(
              Padding(
                padding: const EdgeInsets.all(8),
                child: Column(
                  children: [
                    Row(
                      children: [
                        Expanded(
                          child: AppTextField(
                            maxLength: 100,
                            etiqueta: 'Clave',
                            controller: _clave,
                            hintText: 'Clave Toping Categoria',
                          ),
                        ),
                      ],
                    ),
                    Row(
                      children: [
                        Expanded(
                          child: AppTextField(
                            maxLength: 100,
                            etiqueta: 'Nombre',
                            controller: _nombre,
                            hintText: 'Nombre Toping Categoria',
                          ),
                        ),
                      ],
                    ),
                    Row(
                      children: [
                        Expanded(
                          child: AppTextField(
                            maxLength: 1000,
                            maxLines: 3,
                            etiqueta: 'Descripción',
                            controller: _descripcion,
                            hintText: 'Descripción de Toping Categoria',
                          ),
                        ),
                      ],
                    ),
                  ],
                ),
              ),
            ),
            const SizedBox(height: 15),
            tarjeta(Column(children: [
              GridView.count(
                key: const Key("contenedor-1"),
                physics: const NeverScrollableScrollPhysics(),
                shrinkWrap: true,
                padding: const EdgeInsets.all(4),
                crossAxisCount: axiscount,
                crossAxisSpacing: 2,
                mainAxisSpacing: 1,
                children: [
                  ..._registros,
                  agregarMedia(accion: () async {
                    Navigator.push(
                      context,
                      MaterialPageRoute(
                          builder: (context) => const HomeScreen()),
                    );
                  }),
                ],
              ),
              const SizedBox(height: 30),
            ])),
            boton("Guardar", () async {
              Provider.of<TopingCategoriaViewModel>(context, listen: false)
                  .setIsLoading(true);
              await mvm.guardarModelo(
                modelo: TopingCategoria!,
                clave: _clave.text,
                nombre: _nombre.text,
                descripcion: _descripcion.text,
              );
              Provider.of<TopingCategoriaViewModel>(context, listen: false)
                  .setIsLoading(false);
              if (context.mounted) {
                Navigator.pop(context);
              }
            }),
          ],
        ),
      ),
    );
  }

  Widget itemMedia(BuildContext context, int index) {
    MediaTopingCategoria mediaTC =
        Provider.of<TopingCategoriaViewModel>(context, listen: false)
            .selectedTopingCategoria!
            .mediaTopingCategoria[index];

    // Asegúrate de que el objeto media no sea nulo
    if (mediaTC.media == null || mediaTC.media!.ruta!.isEmpty) {
      // Si es nulo, muestra un widget de placeholder
      return Container(
        alignment: Alignment.center,
        padding: EdgeInsets.all(8.0),
        child: Text('Imagen no disponible'),
      );
    }

    // Utiliza el objeto media para mostrar la imagen
    return Card(
      clipBehavior: Clip.antiAlias,
      child: Column(
        children: [
          Expanded(
            child: Image.network(
              mediaTC.media!.ruta!,
              fit: BoxFit.cover,
              errorBuilder: (context, error, stackTrace) {
                // Muestra un mensaje de error o imagen de placeholder
                return Center(child: Text('Error al cargar la imagen'));
              },
            ),
          ),
          Padding(
            padding: EdgeInsets.all(8.0),
            child: Text(mediaTC.media!.nombre ?? 'Sin nombre'),
          ),
        ],
      ),
    );
  }
}
