using RobotNet.Script;

namespace RobotNet.ScriptManager.Connections;

public class UnixDevice : IUnixDevice
{
    public static readonly UnixDevice Instance = new();

    private UnixDevice() { }
    public byte[] ReadDev(string name, int length)
    {
        if (Environment.OSVersion.Platform != PlatformID.Unix)
        {
            throw new PlatformNotSupportedException("This method is only supported on linux.");
        }
        if (length <= 0)
        {
            throw new ArgumentOutOfRangeException(nameof(length), "Length must be greater than zero.");
        }

        if (string.IsNullOrWhiteSpace(name) || name.Any(c => Path.GetInvalidFileNameChars().Contains(c)))
        {
            throw new ArgumentException("Invalid device name.", nameof(name));
        }

        var path = $"/dev/robotnet/{name}";
        if (!File.Exists(path))
        {
            throw new FileNotFoundException($"Device '{name}' not found.", path);
        }

        using var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);

        var buffer = new byte[length];
        var bytesRead = fs.Read(buffer, 0, length);
        fs.Close();

        return buffer;
    }

    public void WriteDev(string name, byte[] data)
    {
        if (Environment.OSVersion.Platform != PlatformID.Unix)
        {
            throw new PlatformNotSupportedException("This method is only supported on linux.");
        }
        if (data == null || data.Length == 0)
        {
            throw new ArgumentNullException(nameof(data), "Data cannot be null or empty.");
        }
        if (string.IsNullOrWhiteSpace(name) || name.Any(c => Path.GetInvalidFileNameChars().Contains(c)))
        {
            throw new ArgumentException("Invalid device name.", nameof(name));
        }
        var path = $"/dev/robotnet/{name}";
        if (!File.Exists(path))
        {
            throw new FileNotFoundException($"Device '{name}' not found.", path);
        }
        using var fs = new FileStream(path, FileMode.Open, FileAccess.Write, FileShare.Read);
        fs.Write(data, 0, data.Length);
        fs.Close();
    }
}
