import 'dart:convert';

import 'package:localstore/localstore.dart';

import 'apiResponse.dart';
import 'webuntis/webuntisError.dart';

abstract class RequestCache<T extends ApiResponse?> {
  static const int cacheNothing = 0;
  static const int cacheMinute = 60;
  static const int cacheHour = 60 * 60;
  static const int cacheDay = 60 * 60 * 24;

  int maxCacheTime;
  Function(T) onUpdate;
  Function(Exception) onError;
  bool? renew;

  RequestCache(this.maxCacheTime, this.onUpdate, {this.onError = ignore, this.renew = false});

  static void ignore(Exception e) {}

  Future<void> start(String file, String document) async {
    var tableData = await Localstore.instance.collection(file).doc(document).get();
    if(tableData != null) {
      onUpdate(onLocalData(tableData['json']));
    }

    if(DateTime.now().millisecondsSinceEpoch - (maxCacheTime * 1000) < (tableData?['lastupdate'] ?? 0)) {
      if(renew == null || !renew!) return;
    }

    try {
      var newValue = await onLoad();
      onUpdate(newValue);

      Localstore.instance.collection(file).doc(document).set({
        'json': jsonEncode(newValue),
        'lastupdate': DateTime.now().millisecondsSinceEpoch
      });
    } on WebuntisError catch(e) {
      onError(e);
    }
  }

  T onLocalData(String json);
  Future<T> onLoad();

}
