// Файловые системы: безопасная запись и концепции
// Компиляция: zig build-exe fs_demo.zig && ./fs_demo

const std = @import("std");

pub fn main() !void {
    const stdout = std.fs.File.stdout().deprecatedWriter();

    try stdout.print("=== Zig: файловые системы ===\n\n", .{});

    // 1. Запись файла
    try stdout.print("--- 1. Запись файла ---\n", .{});
    try stdout.print("  const f = try std.fs.cwd().createFile(\"data.txt\", .{{}});\n", .{});
    try stdout.print("  defer f.close();\n", .{});
    try stdout.print("  try f.writeAll(\"Hello, filesystem!\\n\");\n", .{});
    try stdout.print("  Данные в буфере ОС — не гарантированы на диске.\n\n", .{});

    // 2. fsync
    try stdout.print("--- 2. fsync ---\n", .{});
    try stdout.print("  try f.sync();  // fsync() — сбросить на диск\n", .{});
    try stdout.print("  sync() = fsync(): данные + метаданные.\n", .{});
    try stdout.print("  Без sync() при сбое питания файл может быть пуст.\n\n", .{});

    // 3. Паттерн атомарной замены
    try stdout.print("--- 3. Атомарная замена ---\n", .{});
    try stdout.print("  Шаги безопасного обновления файла:\n", .{});
    try stdout.print("    1. Записать во временный файл (config.tmp)\n", .{});
    try stdout.print("    2. sync() — гарантировать запись\n", .{});
    try stdout.print("    3. std.fs.cwd().rename() — атомарная замена\n", .{});
    try stdout.print("  При сбое: старая ИЛИ новая версия. Не мусор.\n\n", .{});

    // 4. Журналирование
    try stdout.print("--- 4. Журналирование ---\n", .{});
    try stdout.print("  Проблема: сбой между записью данных и метаданных.\n", .{});
    try stdout.print("  Без журнала: файловая система повреждена.\n", .{});
    try stdout.print("  С журналом: «сначала запиши, что собираешься делать».\n", .{});
    try stdout.print("  При восстановлении: проигрываем журнал.\n", .{});
    try stdout.print("  ext3/ext4: журнал метаданных (ordered mode).\n\n", .{});

    // 5. Копирование при записи (CoW)
    try stdout.print("--- 5. Копирование при записи (CoW) ---\n", .{});
    try stdout.print("  ZFS, Btrfs, APFS: данные никогда не перезаписываются.\n", .{});
    try stdout.print("  Новые данные пишутся в новое место.\n", .{});
    try stdout.print("  Указатель переключается атомарно.\n", .{});
    try stdout.print("  Преимущества: снимки (snapshots) — бесплатны.\n", .{});
    try stdout.print("  Контрольные суммы (ZFS): обнаружение повреждений.\n\n", .{});

    // 6. Размеры и единицы
    try stdout.print("--- 6. Размеры ---\n", .{});
    const kb: u64 = 1024;
    const mb = kb * 1024;
    const gb = mb * 1024;
    const tb = gb * 1024;
    try stdout.print("  Блок ext4:          4 КБ = {d} байт\n", .{4 * kb});
    try stdout.print("  Макс. файл ext4:    16 ТБ = {d} байт\n", .{16 * tb});
    try stdout.print("  Макс. том ext4:     1 ЭБ\n", .{});
    try stdout.print("  Макс. файл ZFS:     16 ЭБ\n", .{});
    try stdout.print("  Один сектор SSD:    4 КБ (обычно)\n\n", .{});

    // 7. Zig и файловый ввод-вывод
    try stdout.print("--- 7. Zig: файловый ввод-вывод ---\n", .{});
    try stdout.print("  std.fs.cwd().createFile() — создание файла\n", .{});
    try stdout.print("  std.fs.cwd().openFile()   — открытие\n", .{});
    try stdout.print("  std.fs.cwd().rename()     — атомарная замена\n", .{});
    try stdout.print("  file.sync()               — fsync\n", .{});
    try stdout.print("  Нет скрытой буферизации — write идёт в ядро.\n", .{});

    try stdout.print("\n--- Итог ---\n", .{});
    try stdout.print("fsync: единственная гарантия данных на диске\n", .{});
    try stdout.print("write-sync-rename: безопасное обновление файла\n", .{});
    try stdout.print("Журнал: защита от повреждений при сбое\n", .{});
    try stdout.print("CoW: данные не перезаписываются — снимки бесплатны\n", .{});
}
