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"];
    final conversationsPolicy = response["conversations_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"],
        ),
        conversationsPolicy: ConversationsPolicy(
          minMessageLen: conversationsPolicy["min_message_len"],
          maxMessageLen: conversationsPolicy["max_message_len"],
          allowedFilesType:
              conversationsPolicy["allowed_files_type"].cast<String>(),
          filesMaxSize: conversationsPolicy["files_max_size"],
          writingEventInterval: conversationsPolicy["writing_event_interval"],
          writingEventLifetime: conversationsPolicy["writing_event_lifetime"],
          maxMessageImageWidth: conversationsPolicy["max_message_image_width"],
          maxMessageImageHeight:
              conversationsPolicy["max_message_image_height"],
          maxThumbnailWidth: conversationsPolicy["max_thumbnail_width"],
          maxThumbnailHeight: conversationsPolicy["max_thumbnail_height"],
          maxLogoWidth: conversationsPolicy["max_logo_width"],
          maxLogoHeight: conversationsPolicy["max_logo_height"],
        ));
  }

  /// 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;
  }
}

/// Shortcut for server configuration
ServerConfig get srvConfig => ServerConfigurationHelper.config;