using System.Text;
using SoulstormReplayReader.Core.Extensions;

namespace SoulstormReplayReader.Core.Services;

public static class ReplayService
{
    public static void Rename(Stream inStream, Stream outStream, string newName)
    {
        var binaryReader = new ExBinaryReader(inStream);
        var binaryWriter = new BinaryWriter(outStream);

        // Костыльное нахождение длины старого имени игры
        binaryReader
            .Skip(182) // Перемещаюсь на позицию после (GameInfo.FOLDWMAN....)
            .Skip(binaryReader.ReadInt32() + 20) // DataSdscSize + 24
            .Skip(85);
        var bytesLengthDifference = (newName.Length - binaryReader.ReadInt32()) * 2;
        binaryReader.Seek(0);

        binaryWriter.Write(binaryReader.ReadBytes(149 + 4)); // Перемещаюсь к позиции перед размером FOLDINFO
        binaryWriter.Write(binaryReader.ReadInt32() + bytesLengthDifference); // Переписываю, добавляя разность длинн имен

        binaryWriter.Write(binaryReader.ReadBytes(21 + 4)); // Иду к позиции перед размером FOLDWMAN

        var foldWmanSize = binaryReader.ReadInt32();
        binaryWriter.Write(foldWmanSize);
        binaryWriter.Write(binaryReader.ReadBytes(foldWmanSize + 16)); // Телепортируюсь к позиции перед размером DataBase
        binaryWriter.Write(binaryReader.ReadInt32() + bytesLengthDifference); // Переписываю, добавляя разность длинн имен

        binaryWriter.Write(binaryReader.ReadBytes(85)); // Первые 85 байт DataBase статичные
        binaryWriter.Write(newName.Length); // После них идет длина имени игры

        binaryReader.Skip(binaryReader.ReadInt32() * 2);
        binaryWriter.Write(Encoding.Unicode.GetBytes(newName)); // И ее имя

        while (binaryReader.HasBytes)
            binaryWriter.Write(binaryReader.ReadByte());

        binaryWriter.Flush();
    }
}