namespace Gma.QrCodeNet.Encoding.Versions;

internal struct QRCodeVersion
{
    internal QRCodeVersion(int versionNum, int totalCodewords, ErrorCorrectionBlocks ecblocksL, ErrorCorrectionBlocks ecblocksM, ErrorCorrectionBlocks ecblocksQ, ErrorCorrectionBlocks ecblocksH)
        : this()
    {
        VersionNum = versionNum;
        TotalCodewords = totalCodewords;
        ECBlocks = new ErrorCorrectionBlocks[] { ecblocksL, ecblocksM, ecblocksQ, ecblocksH };
        DimensionForVersion = 17 + (versionNum * 4);
    }

    internal int VersionNum { get; private set; }

    internal int TotalCodewords { get; private set; }

    internal int DimensionForVersion { get; private set; }

    private ErrorCorrectionBlocks[] ECBlocks { get; }

    internal ErrorCorrectionBlocks GetECBlocksByLevel(ErrorCorrectionLevel eCLevel)
    {
        return eCLevel switch
        {
            ErrorCorrectionLevel.L => ECBlocks[0],
            ErrorCorrectionLevel.M => ECBlocks[1],
            ErrorCorrectionLevel.Q => ECBlocks[2],
            ErrorCorrectionLevel.H => ECBlocks[3],
            _ => throw new ArgumentOutOfRangeException(nameof(eCLevel))
        };
    }
}