export interface Migration {
  id: string;
  version: string;
  name: string;
  description?: string;
  type: MigrationType;
  status: MigrationStatus;
  createdAt: string;
  executedAt?: string;
  duration?: number;
  checksum: string;
  up: MigrationScript;
  down?: MigrationScript;
  dependencies?: string[];
  tags?: string[];
  author?: string;
}

export type MigrationType = 'schema' | 'data' | 'seed' | 'index' | 'procedure' | 'config';
export type MigrationStatus = 'pending' | 'running' | 'completed' | 'failed' | 'rolled_back' | 'skipped';

export interface MigrationScript {
  type: 'sql' | 'javascript' | 'typescript' | 'shell';
  content: string;
  transaction?: boolean;
  timeout?: number;
}

export interface MigrationPlan {
  migrations: Migration[];
  estimatedDuration: number;
  risks: MigrationRisk[];
  rollbackable: boolean;
  dependencies: DependencyGraph;
}

export interface MigrationRisk {
  migration: string;
  description: string;
  severity: 'low' | 'medium' | 'high';
  mitigation?: string;
}

export interface DependencyGraph {
  nodes: string[];
  edges: Array<[string, string]>;
}

export interface MigrationHistory {
  projectId: string;
  migrations: MigrationRecord[];
  currentVersion: string;
  lastMigration?: MigrationRecord;
}

export interface MigrationRecord {
  migrationId: string;
  version: string;
  name: string;
  status: MigrationStatus;
  executedAt: string;
  duration: number;
  error?: string;
  logs?: MigrationLog[];
}

export interface MigrationLog {
  timestamp: string;
  level: 'info' | 'warning' | 'error' | 'debug';
  message: string;
  details?: any;
}

export interface MigrationConfig {
  migrationsPath: string;
  database?: DatabaseConfig;
  apiEndpoint?: string;
  fileSystem?: FileSystemConfig;
  validation?: ValidationConfig;
  hooks?: MigrationHooks;
}

export interface DatabaseConfig {
  type: 'postgres' | 'mysql' | 'mongodb' | 'sqlite';
  connectionString?: string;
  host?: string;
  port?: number;
  database?: string;
  username?: string;
  password?: string;
  ssl?: boolean;
}

export interface FileSystemConfig {
  basePath: string;
  backupPath?: string;
  encoding?: string;
}

export interface ValidationConfig {
  checksumValidation: boolean;
  syntaxCheck: boolean;
  dryRun: boolean;
  requireRollback: boolean;
}

export interface MigrationHooks {
  beforeAll?: string;
  beforeEach?: string;
  afterEach?: string;
  afterAll?: string;
  onError?: string;
}

export interface MigrationTemplate {
  name: string;
  type: MigrationType;
  description: string;
  template: string;
  variables?: Record<string, string>;
}

export interface DataTransformation {
  source: string;
  target: string;
  transform: (data: any) => any;
  validation?: (data: any) => boolean;
  batchSize?: number;
}

export interface MigrationValidation {
  isValid: boolean;
  errors: string[];
  warnings: string[];
  suggestions: string[];
}