import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'datamodel.dart';
import 'addevent.dart';
import 'viewevents.dart';
import 'overview.dart';
import 'configuration.dart';
import 'databaseconnector.dart';

Future<void> loadConfiguration() async {
  final ConfigurationStoreInstance configuration = ConfigurationStoreInstance();
  final EventStoreInstance event = EventStoreInstance();
  WidgetsFlutterBinding.ensureInitialized();

  final prefs = await SharedPreferences.getInstance();
  final String? storedConfiguration = prefs.getString('configuration');
  if (storedConfiguration != null){
    debugPrint('Configuration String: ' + storedConfiguration);
    configuration.fromMap(jsonDecode(storedConfiguration));
    debugPrint('Configuration loaded from shared preferences');
  }else{
    debugPrint('Failed to load configuration from shared preferences.');
  }

  final String? currentEvent = prefs.getString('currentEvent');
  if (currentEvent != null){
    debugPrint('Configuration Current Event String: ' + currentEvent);
    event.fromMap(jsonDecode(currentEvent));
    debugPrint('Configuration Current Event loaded from shared preferences');
  }else{
    debugPrint('Failed to load Current Event configuration from shared preferences.');
  }


  //const storage = FlutterSecureStorage();   //TODO: move login information to secure storage
  //Map<String, String> allValues = await storage.readAll();
  //print('Secure Storage: ' + allValues.toString());

  var database = DatabaseInstance();
  await database.connect();  //Do once at start of APP!

  //TODO: there should be a loding screen until configuration is loaded and database connection is established.
}

void main() {
  loadConfiguration();

  EventStoreInstance events = EventStoreInstance();
  final ConfigurationStoreInstance configuration = ConfigurationStoreInstance();

  //Reset old data
  events.reset();  // TODO: load configuration and events from shared preferences.
  configuration.reset();

  configuration.loginInformation = SensorLogin.fromJson({"mail":"admin","password":"adminadmin"}); //TODO: replace for productive version.

  runApp(MaterialApp(
    title: 'Mobile Event Log',
    theme: ThemeData(
      primarySwatch: Colors.blue,
    ),
    initialRoute: '/',
    routes: {
      '/': (context) => const Overview(),
      '/second': (context) => const AddEvent(),
      '/third': (context) => const ViewEvents(),
      '/forth': (context) => const Configuration(),
    },
  ));
}