#ifndef __ZVFS_OPEN_FILE_H__
#define __ZVFS_OPEN_FILE_H__

#include "common/uthash.h"
#include "spdk_engine/io_engine.h"
#include <stdint.h>

struct zvfs_open_file {
    int                         fd;               // key，和真实 fd 1:1
    struct zvfs_inode           *inode;
    uint64_t                    handle_id;

    int                         flags;            
    int                         fd_flags;

    uint64_t                    offset;           // 非 APPEND 模式的当前位置

    UT_hash_handle              hh;
};

// 分配 openfile，不插入全局表
struct zvfs_open_file *openfile_alloc(int fd, struct zvfs_inode *inode,
                                      int flags, uint64_t handle_id);

// 释放内存
void openfile_free(struct zvfs_open_file *of);

// 插入全局表（需持有 fd_mu）
void openfile_insert(struct zvfs_open_file *of);

// 按 fd 查找（需持有 fd_mu）
struct zvfs_open_file *openfile_lookup(int fd);

// 从全局表移除（需持有 fd_mu，不释放内存）
void openfile_remove(int fd);

// lseek 语义：返回新 offset，出错返回 (uint64_t)-1
// 需持有 of->inode->mu（读 logical_size）
uint64_t openfile_seek(struct zvfs_open_file *of, int64_t offset, int whence);

#endif // __ZVFS_OPEN_FILE_H__
