import type { RoutesManifest } from "../spec/schema";
import type { ManduLockfile } from "../lockfile";

/**
 * 변경 기록 - 하나의 트랜잭션을 나타냄
 */
export interface ChangeRecord {
  /** 고유 ID: YYYYMMDD-HHmmss-xxx 형식 */
  id: string;
  /** 변경 설명 (선택) */
  message?: string;
  /** 상태: active(진행중), committed(확정), rolled_back(롤백됨) */
  status: "active" | "committed" | "rolled_back";
  /** 생성 시각 ISO 문자열 */
  createdAt: string;
  /** 연결된 스냅샷 ID */
  snapshotId: string;
  /** Auto-correct에 의해 생성됨 여부 */
  autoGenerated?: boolean;
}

/**
 * 스냅샷 - 특정 시점의 spec 상태를 저장
 */
export interface Snapshot {
  /** 고유 ID */
  id: string;
  /** 생성 시각 ISO 문자열 */
  timestamp: string;
  /** routes.manifest.json 내용 (~1KB) */
  manifest: RoutesManifest;
  /** Legacy lock 데이터 (하위호환용, 새 스냅샷에서는 항상 null) */
  lock: { routesHash: string; updatedAt: string } | null;
  /** Slot 파일 내용만 저장 (Generated 파일은 재생성 가능) */
  slotContents: Record<string, string>;
  /** 설정 스냅샷 (Lockfile 포함) - ont-run 통합 */
  configSnapshot?: ConfigSnapshot;
}

/**
 * 설정 스냅샷 - mandu.config의 상태를 저장
 */
export interface ConfigSnapshot {
  /** Lockfile 데이터 */
  lockfile: ManduLockfile;
  /** 설정 해시 */
  configHash: string;
}

/**
 * 현재 트랜잭션 상태
 */
export interface TransactionState {
  /** 트랜잭션 활성화 여부 */
  active: boolean;
  /** 현재 활성 변경 ID */
  changeId: string | null;
  /** 현재 활성 스냅샷 ID */
  snapshotId: string | null;
}

/**
 * History 설정
 */
export interface HistoryConfig {
  /** 최대 보관 스냅샷 수 (기본: 5) */
  maxSnapshots: number;
  /** 자동 정리 활성화 (기본: true) */
  autoCleanup: boolean;
}

/**
 * 스냅샷 복원 결과
 */
export interface RestoreResult {
  success: boolean;
  restoredFiles: string[];
  failedFiles: string[];
  errors: string[];
}

/**
 * 커밋 결과
 */
export interface CommitResult {
  success: boolean;
  changeId: string;
  message?: string;
}

/**
 * 롤백 결과
 */
export interface RollbackResult {
  success: boolean;
  changeId: string;
  restoreResult: RestoreResult;
}

/**
 * beginChange 옵션
 */
export interface BeginChangeOptions {
  message?: string;
  autoGenerated?: boolean;
}

/**
 * 기본 History 설정
 */
export const DEFAULT_HISTORY_CONFIG: HistoryConfig = {
  maxSnapshots: 5,
  autoCleanup: true,
};
