/**
 * Backup-related data shapes for Onebox
 */

import type { TPlatformServiceType } from './platform.ts';

export type TBackupRestoreMode = 'restore' | 'import' | 'clone';
export type TBackupScheduleScope = 'all' | 'pattern' | 'service';

export interface IRetentionPolicy {
  hourly: number;
  daily: number;
  weekly: number;
  monthly: number;
}

export const RETENTION_PRESETS = {
  standard: { hourly: 0, daily: 7, weekly: 4, monthly: 12 },
  frequent: { hourly: 24, daily: 7, weekly: 4, monthly: 12 },
  minimal: { hourly: 0, daily: 3, weekly: 2, monthly: 6 },
  longterm: { hourly: 0, daily: 14, weekly: 8, monthly: 24 },
} as const;

export type TRetentionPreset = keyof typeof RETENTION_PRESETS | 'custom';

export interface IBackup {
  id?: number;
  serviceId: number;
  serviceName: string;
  filename: string;
  snapshotId?: string;
  sizeBytes: number;
  storedSizeBytes?: number;
  createdAt: number;
  includesImage: boolean;
  platformResources: TPlatformServiceType[];
  checksum: string;
  scheduleId?: number;
}

export interface IBackupSchedule {
  id?: number;
  scopeType: TBackupScheduleScope;
  scopePattern?: string;
  serviceId?: number;
  serviceName?: string;
  cronExpression: string;
  retention: IRetentionPolicy;
  enabled: boolean;
  lastRunAt: number | null;
  nextRunAt: number | null;
  lastStatus: 'success' | 'failed' | null;
  lastError: string | null;
  createdAt: number;
  updatedAt: number;
}

export interface IBackupScheduleCreate {
  scopeType: TBackupScheduleScope;
  scopePattern?: string;
  serviceName?: string;
  cronExpression: string;
  retention: IRetentionPolicy;
  enabled?: boolean;
}

export interface IBackupScheduleUpdate {
  cronExpression?: string;
  retention?: IRetentionPolicy;
  enabled?: boolean;
}

export interface IRestoreOptions {
  mode: TBackupRestoreMode;
  newServiceName?: string;
  overwriteExisting?: boolean;
  skipPlatformData?: boolean;
}

export interface IRestoreResult {
  service: {
    name: string;
    status: string;
  };
  platformResourcesRestored: number;
  warnings: string[];
}

export interface IBackupPasswordStatus {
  isConfigured: boolean;
}
