import 'package:json_annotation/json_annotation.dart';
import 'package:selfprivacy/logic/api_maps/graphql_maps/schema/backups.graphql.dart';
import 'package:selfprivacy/logic/api_maps/graphql_maps/schema/schema.graphql.dart';
import 'package:selfprivacy/logic/models/hive/backups_credential.dart';

class Backup {
  Backup.fromGraphQL(
    final Query$AllBackupSnapshots$backup$allSnapshots snapshot,
  ) : this(
          id: snapshot.id,
          time: snapshot.createdAt,
          serviceId: snapshot.service.id,
          fallbackServiceName: snapshot.service.displayName,
        );

  Backup({
    required this.time,
    required this.id,
    required this.serviceId,
    required this.fallbackServiceName,
  });

  // Time of the backup
  final DateTime time;
  @JsonKey(name: 'short_id')
  final String id;
  final String serviceId;
  final String fallbackServiceName;
}

class BackupConfiguration {
  BackupConfiguration.fromGraphQL(
    final Query$BackupConfiguration$backup$configuration configuration,
  ) : this(
          // Provided by API as int of minutes
          autobackupPeriod: configuration.autobackupPeriod != null
              ? Duration(minutes: configuration.autobackupPeriod!)
              : null,
          encryptionKey: configuration.encryptionKey,
          isInitialized: configuration.isInitialized,
          locationId: configuration.locationId,
          locationName: configuration.locationName,
          provider: BackupsProviderType.fromGraphQL(configuration.provider),
        );

  BackupConfiguration({
    required this.autobackupPeriod,
    required this.encryptionKey,
    required this.isInitialized,
    required this.locationId,
    required this.locationName,
    required this.provider,
  });

  final Duration? autobackupPeriod;
  final String encryptionKey;
  final bool isInitialized;
  final String? locationId;
  final String? locationName;
  final BackupsProviderType provider;
}

enum BackupRestoreStrategy {
  inplace,
  downloadVerifyOverwrite,
  unknown;

  factory BackupRestoreStrategy.fromGraphQL(
    final Enum$RestoreStrategy strategy,
  ) =>
      switch (strategy) {
        Enum$RestoreStrategy.INPLACE => inplace,
        Enum$RestoreStrategy.DOWNLOAD_VERIFY_OVERWRITE =>
          downloadVerifyOverwrite,
        Enum$RestoreStrategy.$unknown => unknown,
      };

  Enum$RestoreStrategy get toGraphQL => switch (this) {
        inplace => Enum$RestoreStrategy.INPLACE,
        downloadVerifyOverwrite =>
          Enum$RestoreStrategy.DOWNLOAD_VERIFY_OVERWRITE,
        unknown => Enum$RestoreStrategy.$unknown,
      };
}