using System.Numerics;
using System.Text;

namespace KeepersCompound.LGS;

public static class Extensions
{
    public static Vector3 ReadRotation(this BinaryReader reader)
    {
        var raw = new Vector3(reader.ReadUInt16(), reader.ReadUInt16(), reader.ReadUInt16());
        return raw * 360 / (ushort.MaxValue + 1);
    }

    public static void WriteRotation(this BinaryWriter writer, Vector3 rotation)
    {
        var raw = rotation * (ushort.MaxValue + 1) / 360;
        writer.Write((ushort)raw.X);
        writer.Write((ushort)raw.Y);
        writer.Write((ushort)raw.Z);
    }

    public static Vector3 ReadVec3(this BinaryReader reader)
    {
        return new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
    }

    public static void WriteVec3(this BinaryWriter writer, Vector3 vec)
    {
        writer.Write(vec.X);
        writer.Write(vec.Y);
        writer.Write(vec.Z);
    }

    public static Vector2 ReadVec2(this BinaryReader reader)
    {
        return new Vector2(reader.ReadSingle(), reader.ReadSingle());
    }

    public static void WriteVec2(this BinaryWriter writer, Vector2 vec)
    {
        writer.Write(vec.X);
        writer.Write(vec.Y);
    }

    public static string ReadNullString(this BinaryReader reader, int length)
    {
        var tmpName = Encoding.UTF8.GetString(reader.ReadBytes(length));
        var idx = tmpName.IndexOf('\0');
        if (idx >= 0) tmpName = tmpName[..idx];
        return tmpName;
    }

    public static void WriteNullString(this BinaryWriter writer, string nullString, int length)
    {
        var writeBytes = new byte[length];
        var stringBytes = Encoding.UTF8.GetBytes(nullString);
        stringBytes[..Math.Min(length, stringBytes.Length)].CopyTo(writeBytes, 0);
        writer.Write(writeBytes);
    }
}
