namespace Gma.QrCodeNet.Encoding;

public struct VersionDetail
{
    internal VersionDetail(int version, int numTotalBytes, int numDataBytes, int numECBlocks)
        : this()
    {
        Version = version;
        NumTotalBytes = numTotalBytes;
        NumDataBytes = numDataBytes;
        NumECBlocks = numECBlocks;
    }

    internal int Version { get; private set; }
    internal int NumTotalBytes { get; private set; }
    internal int NumDataBytes { get; private set; }
    internal int NumECBlocks { get; private set; }

    internal int MatrixWidth => Width(Version);

    internal int ECBlockGroup1 => NumECBlocks - ECBlockGroup2;

    internal int ECBlockGroup2 => NumTotalBytes % NumECBlocks;

    internal int NumDataBytesGroup1 => NumDataBytes / NumECBlocks;

    internal int NumDataBytesGroup2 => NumDataBytesGroup1 + 1;

    internal int NumECBytesPerBlock => (NumTotalBytes - NumDataBytes) / NumECBlocks;

    internal static int Width(int version) => 17 + (4 * version);

    public override string ToString() => $"{Version};{NumTotalBytes};{NumDataBytes};{NumECBlocks}";
}