package com.termux.shared.file.filesystem;

import android.system.ErrnoException;
import android.system.Os;

import java.io.File;
import java.io.FileDescriptor;
import java.io.IOException;

public class NativeDispatcher {

    public static void stat(String filePath, FileAttributes fileAttributes) throws IOException {
        validateFileExistence(filePath);

        try {
            fileAttributes.loadFromStructStat(Os.stat(filePath));
        } catch (ErrnoException e) {
            throw new IOException("Failed to run Os.stat() on file at path \"" + filePath + "\": " + e.getMessage());
        }
    }

    public static void lstat(String filePath, FileAttributes fileAttributes) throws IOException {
        validateFileExistence(filePath);

        try {
            fileAttributes.loadFromStructStat(Os.lstat(filePath));
        } catch (ErrnoException e) {
            throw new IOException("Failed to run Os.lstat() on file at path \"" + filePath + "\": " + e.getMessage());
        }
    }

    public static void fstat(FileDescriptor fileDescriptor, FileAttributes fileAttributes) throws IOException {
        validateFileDescriptor(fileDescriptor);

        try {
            fileAttributes.loadFromStructStat(Os.fstat(fileDescriptor));
        } catch (ErrnoException e) {
            throw new IOException("Failed to run Os.fstat() on file descriptor \"" + fileDescriptor + "\": " + e.getMessage());
        }
    }

    public static void validateFileExistence(String filePath) throws IOException {
        if (filePath == null || filePath.isEmpty()) throw new IOException("The path is null or empty");

        File file = new File(filePath);

        //if (!file.exists())
        //    throw new IOException("No such file or directory: \"" + filePath + "\"");
    }

    public static void validateFileDescriptor(FileDescriptor fileDescriptor) throws IOException {
        if (fileDescriptor == null) throw new IOException("The file descriptor is null");

        if (!fileDescriptor.valid())
            throw new IOException("No such file descriptor: \"" + fileDescriptor + "\"");
    }

}
