import 'dart:async';
import 'dart:convert';
import 'package:filesize/filesize.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:jiffy/jiffy.dart';
import 'package:localstore/localstore.dart';

import '../../../widget/placeholderView.dart';
import 'jsonViewer.dart';

class CacheView extends StatefulWidget {
  final collection = "MarianumMobile";
  const CacheView({Key? key}) : super(key: key);

  @override
  State<CacheView> createState() => _CacheViewState();

  Future<void> clear() async {
    await Localstore.instance.collection(collection).delete();
  }

  Future<int> totalSize() async {
    var data = await Localstore.instance.collection(collection).get();
    if(data!.length <= 1) return jsonEncode(data.values.first).length * 8;
    return data.values.reduce((a, b) => jsonEncode(a).length + jsonEncode(b).length) * 8;
  }
}

class _CacheViewState extends State<CacheView> {
  final Localstore storage = Localstore.instance;
  late Future<Map<String, dynamic>?> files;

  @override
  void initState() {
    files = Localstore.instance.collection(widget.collection).get();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Lokaler cache"),
      ),
      body: FutureBuilder(
        future: files,
        builder: (context, snapshot) {
          if(snapshot.hasData) {
            return ListView.builder(
              itemCount: snapshot.data!.length,
              itemBuilder: (context, index) {
                Map<String, dynamic> element = snapshot.data![snapshot.data!.keys.elementAt(index)];
                String filename = snapshot.data!.keys.elementAt(index).split("/").last;

                return ListTile(
                  leading: const Icon(Icons.text_snippet_outlined),
                  title: Text(filename),
                  subtitle: Text("${filesize(jsonEncode(element).length * 8)}, ${Jiffy.parseFromMillisecondsSinceEpoch(element['lastupdate']).fromNow()}"),
                  trailing: const Icon(Icons.arrow_right),
                  onTap: () {
                    Navigator.push(context, MaterialPageRoute(builder: (context) {
                      return JsonViewer(title: filename, data: jsonDecode(element['json']));
                    },));
                  },
                  onLongPress: () {
                    showDialog(context: context, builder: (context) {
                      return SimpleDialog(
                        children: [
                          const ListTile(
                            leading: Icon(Icons.delete_forever),
                            title: Text("Diese Datei löschen"),
                          ),
                          ListTile(
                            leading: const Icon(Icons.copy),
                            title: const Text("Dateitext kopieren"),
                            onTap: () {
                              Clipboard.setData(ClipboardData(text: jsonEncode(element)));
                              Navigator.of(context).pop();
                            },
                          )
                        ],
                      );
                    });
                  },
                );
              },
            );
          } else if(snapshot.connectionState != ConnectionState.done) {
            return const Center(
                child: CircularProgressIndicator()
            );
          } else {
            return const Center(
              child: PlaceholderView(icon: Icons.hourglass_empty, text: "Keine Daten"),
            );
          }
        },
      ),
    );
  }
}

extension FutureExtension<T> on Future<T> {
  bool isCompleted() {
    final completer = Completer<T>();
    then(completer.complete).catchError(completer.completeError);
    return completer.isCompleted;
  }
}