import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';

import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:localstore/localstore.dart';
import 'package:path_provider/path_provider.dart';
import 'package:quiosco_soler_2/quiosco/models/db_archivos_model.dart';
import 'package:quiosco_soler_2/quiosco/providers/archivos_provider.dart';
import 'package:quiosco_soler_2/quiosco/widgets/file_name_down.dart';
import 'package:quiosco_soler_2/src/pages/pdf_viewer.dart';

class GridViewArchivos extends StatefulWidget {
   final List<DbArchivos> elements;

   const GridViewArchivos({
     Key? key,
     required this.elements,
   }) : super(key: key);

   @override
   State<GridViewArchivos> createState() => _GridViewArchivosState();
}

class _GridViewArchivosState extends State<GridViewArchivos> {
  final _archivosProvider = ArchivosProvider();
  final _db = Localstore.instance;

  bool _enabled = true;
  
   @override
   Widget build(BuildContext context) {
     return GridView.count(
       childAspectRatio: (2/3.5),
       crossAxisCount: 3,
       children: List.generate(widget.elements.length, (index) => TextButton(
         style: TextButton.styleFrom(
           padding: EdgeInsets.zero,
           tapTargetSize: MaterialTapTargetSize.shrinkWrap,
           minimumSize: const Size(0, 0),
         ),
         child: FileNameDown(
           name: widget.elements[index].arch!,
           image: widget.elements[index].idim!,
           date: 'Publicado el ${widget.elements[index].fecr}',
         ),
         onPressed: !_enabled ? null : () async{
           setState(() => _enabled = false);

           Fluttertoast.showToast(
             msg: 'Abriendo PDF...',
             toastLength: Toast.LENGTH_LONG,
             gravity: ToastGravity.CENTER,
             timeInSecForIosWeb: 2,
           );
           
           final items = await _db.collection('quiosco').get();
           final keys = items!.keys;
           final key = keys.last;

           final info = items[key];
           final token = info['accessToken'];

           final archivo = await _archivosProvider.fetchArchivo(token, '${widget.elements[index].idar}');
           final name = await _createFileFromString(archivo.data!, archivo.name!);

           await Navigator.push(context, MaterialPageRoute(
             builder: (context) => PDFViewer(
               localFile: true,
               file: name,
             ),
           ));

           setState(() => _enabled = true);
         },
       )),
     );
   }

   Future<File> _createFileFromString(String encoded, String name) async{
     Uint8List  bytes = base64Decode(encoded);
     String dir = (await getApplicationDocumentsDirectory()).path;
     File file = File("$dir/$name");

     await file.writeAsBytes(bytes);

     return file;
   }
}
