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

import '../data_classes.dart';
import '../server_requests/fetch_markers.dart';
import '../server_requests/fetch_relation.dart';


/// initialiseState makes three requests to the server, one requesting
/// measurements for the selected relation, the other requesting the relation,
/// and the last requesting the list of all system lakes
Future<void> initialiseState() async {
  bool serverConnection = true;

  late Future<List<Measurement>> markerListFuture;
  late Future<Uint8List> relationFuture;

  try {
    // Try to fetch measurement data from server
    markerListFuture = fetchMeasurements().then((fetchResult) {
      List<Measurement> measurements = fetchResult.measurements;
      serverConnection = fetchResult.connected;

      // Return measurements
      return measurements;
    }).catchError((error) {
      serverConnection = false;
      throw Exception("Failed to fetch measurements: $error");
    });

    // If measurements were fetched successfully, request relation
    if (serverConnection) {
      relationFuture = fetchRelation();
    } /*else { // Read last saved data
      relationFuture = loadSavedRelation();
    }*/

    initSearchOptions();

    //selectedRelation = await relationFuture;
    selectedRelation = Uint8List(0);
    selectedMarkerList = await markerListFuture;
  } catch (e) {
    // Handle any errors that occur during the initialization process
    print("Error during initialization: $e");
  }
}


/// initSearchOptions fetches a list of all lake names in the system
/// and initialises lakeSearchOptions
Future<void> initSearchOptions() async {
  try {
    HttpClient client = HttpClient()
      ..badCertificateCallback = // NB: temporary disable SSL certificate validation
          (X509Certificate cert, String host, int port) => true;

    var request = await client.getUrl(Uri.parse('${serverURI}get_lake_names'));
    var response = await request.close();

    if (response.statusCode == 200) {
      var responseBody = await response.transform(utf8.decoder).join();

      if (responseBody.isNotEmpty) {
        var jsonData = json.decode(responseBody);

        if (jsonData != null && jsonData is List) {
          lakeSearchOptions = jsonData.map<String>((item) => item.toString()).toList();
          return;
        }
      }
    }
  } catch (e) {
    lakeSearchOptions = ["Mjøsa"]; // Init default list
  }
}