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

import '../../../widget/placeholder_view.dart';
import '../../api/request_cache.dart';
import '../app_progress_indicator.dart';
import 'json_viewer.dart';

class CacheView extends StatefulWidget {
  const CacheView({super.key});

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

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

  Future<int> totalSize() async {
    final data = await Localstore.instance
        .collection(RequestCache.collection)
        .get();
    if (data == null || data.isEmpty) return 0;
    return data.values.fold<int>(
          0,
          (sum, value) => sum + jsonEncode(value).length,
        ) *
        8;
  }
}

class _CacheViewState extends State<CacheView> {
  late Future<Map<String, dynamic>?> files;

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

  @override
  Widget build(BuildContext context) => Scaffold(
    appBar: AppBar(title: const Text('Cache storage')),
    body: FutureBuilder(
      future: files,
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          return ListView.builder(
            itemCount: snapshot.data!.length,
            itemBuilder: (context, index) {
              final key = snapshot.data!.keys.elementAt(index);
              final element = snapshot.data![key] as Map<String, dynamic>;
              final filename = key.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'] as int).fromNow()}',
                ),
                trailing: const Icon(Icons.arrow_right),
                onTap: () => JsonViewer.asDialog(
                  context,
                  jsonDecode(element['json'] as String) as Map<String, dynamic>,
                ),
              );
            },
          );
        } else if (snapshot.connectionState != ConnectionState.done) {
          return const Center(child: AppProgressIndicator.large());
        } else {
          return const Center(
            child: PlaceholderView(
              icon: Icons.hourglass_empty,
              text: 'Keine Daten',
            ),
          );
        }
      },
    ),
  );
}
