import 'dart:io';
import 'dart:async';
import 'dart:convert';
import 'dart:typed_data';
import 'package:path_provider/path_provider.dart';

import '../../consts.dart';

/// Fetch relation data from server
Future<Uint8List> fetchRelation() async {
  try {
    // Custom HTTP client
    HttpClient client = HttpClient()
      ..badCertificateCallback = // NB: temporary disable SSL certificate validation
          (X509Certificate cert, String host, int port) => true;

    // Execute request to to get_relation endpoint
    var request = await client.getUrl(Uri.parse('${serverURI}get_relation'));
    var response = await request.close(); // Close response body at end of function

    // Try to parse body to JSON if request is ok
    if (response.statusCode == 200) {
      var responseBody = await response.transform(utf8.decoder).join();

      if (responseBody.isNotEmpty) {
        Directory appDocumentsDirectory = await getApplicationDocumentsDirectory();
        String filePath = '${appDocumentsDirectory.path}/last_relation.json';

        try { // Write most recent time of update to file
          await File(filePath).writeAsString(responseBody, mode: FileMode.write);
          print('Relation written to file');
        } catch (error) { print('Error in writing to file: $error');}

        // Return relation data from the response body
        return Uint8List.fromList(utf8.encode(responseBody));
      }
    }
    return loadSavedRelation();
  } catch (e) {
    return loadSavedRelation();
  }
}

Future<Uint8List> loadSavedRelation() async {
  // Get latest saved relation from file if the server does not respond
  Directory appDocumentsDirectory = await getApplicationDocumentsDirectory();
  String filePath = '${appDocumentsDirectory.path}/last_relation.json';

  // Read file contents
  File file = File(filePath);
  if (await file.exists()) {
    String contents = await file.readAsString();
    List<dynamic> jsonData = json.decode(contents); // Parse JSON string from file
    Uint8List relation = Uint8List.fromList(utf8.encode(jsonData.toString()));
    return relation;
  } else {
    throw Exception('File does not exist');
  }
}