import 'package:comunic/models/api_request.dart';
import 'package:comunic/models/server_config.dart';
import 'package:version/version.dart';

/// Server configuration helper
///
/// @author Pierre Hubert

class ServerConfigurationHelper {
  static ServerConfig _config;

  /// Make sure the configuration has been correctly loaded
  static Future<void> ensureLoaded() async {
    if (_config != null) return;

    final response =
        (await APIRequest.withoutLogin("server/config").execWithThrow())
            .getObject();

    final passwordPolicy = response["password_policy"];
    final dataConservationPolicy = response["data_conservation_policy"];

    _config = ServerConfig(
      minSupportedMobileVersion:
          Version.parse(response["min_supported_mobile_version"]),
      termsURL: response["terms_url"],
      playStoreURL: response["play_store_url"],
      androidDirectDownloadURL: response["android_direct_download_url"],
      passwordPolicy: PasswordPolicy(
        allowMailInPassword: passwordPolicy["allow_email_in_password"],
        allowNameInPassword: passwordPolicy["allow_name_in_password"],
        minPasswordLength: passwordPolicy["min_password_length"],
        minNumberUpperCaseLetters:
            passwordPolicy["min_number_upper_case_letters"],
        minNumberLowerCaseLetters:
            passwordPolicy["min_number_lower_case_letters"],
        minNumberDigits: passwordPolicy["min_number_digits"],
        minNumberSpecialCharacters:
            passwordPolicy["min_number_special_characters"],
        minCategoriesPresence: passwordPolicy["min_categories_presence"],
      ),
      dataConservationPolicy: ServerDataConservationPolicy(
        minInactiveAccountLifetime:
            dataConservationPolicy["min_inactive_account_lifetime"],
        minNotificationLifetime:
            dataConservationPolicy["min_notification_lifetime"],
        minCommentsLifetime: dataConservationPolicy["min_comments_lifetime"],
        minPostsLifetime: dataConservationPolicy["min_posts_lifetime"],
        minConversationMessagesLifetime:
            dataConservationPolicy["min_conversation_messages_lifetime"],
        minLikesLifetime: dataConservationPolicy["min_likes_lifetime"],
      ),
    );
  }

  /// Get current server configuration, throwing if it is not loaded yet
  static ServerConfig get config {
    if (_config == null)
      throw Exception(
          "Trying to access server configuration but it is not loaded yet!");

    return _config;
  }
}