#ifndef __ZVFS_INODE_H__
#define __ZVFS_INODE_H__

#include "common/uthash.h"

#include <stdint.h>
#include <stdbool.h>
#include <time.h>
#include <pthread.h>
#include <sys/types.h>
#include <stdatomic.h>

typedef enum {
    ZVFS_ITYPE_FILE = 0,
    ZVFS_ITYPE_DIR  = 1,
} zvfs_itype_t;

struct zvfs_inode {
    uint64_t              blob_id;
    uint64_t              logical_size;           // 和真实文件 st_size 保持同步
    zvfs_itype_t          itype;                  // FILE only，DIR 不进这张表

    mode_t                mode;                   // 权限
    uid_t                 uid;                    // 
    gid_t                 gid;
    time_t                atime, mtime;    

    atomic_int            ref_count;
    pthread_mutex_t       mu;                     // 护 logical_size、append_offset 等更新
    bool                  deleted;

    UT_hash_handle    hh;
};

// 分配并初始化一个 inode，不插入全局表
struct zvfs_inode *inode_alloc(uint64_t blob_id, mode_t mode, zvfs_itype_t itype);

// 释放 inode 内存（调用前确保 ref_count == 0）
void inode_free(struct zvfs_inode *inode);

// 插入全局表（需持有 inode_mu）
void inode_insert(struct zvfs_inode *inode);

// 按 blob_id 查找（需持有 inode_mu）
struct zvfs_inode *inode_lookup(uint64_t blob_id);

// 从全局表移除（需持有 inode_mu，不释放内存）
void inode_remove(uint64_t blob_id);

// 更新 logical_size，同时负责调用 ftruncate 同步 st_size
// 需持有 inode->mu
int inode_update_size(struct zvfs_inode *inode, int real_fd, uint64_t new_size);

// 更新时间戳（需持有 inode->mu）
void inode_touch_atime(struct zvfs_inode *inode);
void inode_touch_mtime(struct zvfs_inode *inode);

#endif // __ZVFS_INODE_H__