const std = @import("std");
const Pool = std.Thread.Pool;
const SchemaEngine = @import("../schema/core.zig");

const ZipponError = @import("error").ZipponError;
const log = std.log.scoped(.fileEngine);

var path_to_ZipponDB_dir_buffer: [1024]u8 = undefined;

/// Manage everything that is relate to read or write in files
/// Or even get stats, whatever. If it touch files, it's here
pub const Self = @This();

// This basically expend the file with other
// So I can define function in other file for the same struct
pub usingnamespace @import("utils.zig");
pub usingnamespace @import("directory.zig");
pub usingnamespace @import("read.zig");
pub usingnamespace @import("write.zig");
pub usingnamespace @import("dump.zig");

allocator: std.mem.Allocator = std.heap.page_allocator,
path_to_ZipponDB_dir: []const u8,
thread_pool: *Pool, // same pool as the ThreadEngine
schema_engine: SchemaEngine = undefined, // This is init after the FileEngine and I attach after. Do I need to init after tho ?

pub fn init(path: []const u8, thread_pool: *Pool) ZipponError!Self {
    return Self{
        .path_to_ZipponDB_dir = std.fmt.bufPrint(&path_to_ZipponDB_dir_buffer, "{s}", .{path}) catch return ZipponError.MemoryError,
        .thread_pool = thread_pool,
    };
}
