#ifndef POI_AUDIOLINK
#define POI_AUDIOLINK

UNITY_DECLARE_TEX2D(_AudioTexture);
float4 _AudioTexture_ST;
fixed _AudioLinkDelay;
fixed _AudioLinkAveraging;
fixed _AudioLinkAverageRange;

// Debug
fixed _EnableAudioLinkDebug;
fixed _AudioLinkDebugTreble;
fixed _AudioLinkDebugHighMid;
fixed _AudioLinkDebugLowMid;
fixed _AudioLinkDebugBass;
fixed _AudioLinkDebugAnimate;
fixed _AudioLinkTextureVisualization;

void AudioTextureExists()
{
    half testw = 0;
    half testh = 0;
    _AudioTexture.GetDimensions(testw, testh);
    poiMods.audioLinkTextureExists = testw >= 32;

    switch(testw)
    {
        case 32: // V1
        poiMods.audioLinkVersion = 1;
        break;
        case 128: // V2
        poiMods.audioLinkVersion = 2;
        break;
        default:
        poiMods.audioLinkVersion = 1;
        break;
    }
}

float getBandAtTime(float band, fixed time, fixed width)
{
    float versionUvMultiplier = 1;

    if (poiMods.audioLinkVersion == 2)
    {
        versionUvMultiplier = 0.0625;
    }
    return UNITY_SAMPLE_TEX2D(_AudioTexture, float2(time * width, (band * .25 + .125) * versionUvMultiplier)).r;
}

void initAudioBands()
{
    AudioTextureExists();

    float versionUvMultiplier = 1;

    if (poiMods.audioLinkVersion == 2)
    {
        versionUvMultiplier = 0.0625;
    }

    if (poiMods.audioLinkTextureExists)
    {
        poiMods.audioLink.x = UNITY_SAMPLE_TEX2D(_AudioTexture, float2(_AudioLinkDelay, .125 * versionUvMultiplier));
        poiMods.audioLink.y = UNITY_SAMPLE_TEX2D(_AudioTexture, float2(_AudioLinkDelay, .375 * versionUvMultiplier));
        poiMods.audioLink.z = UNITY_SAMPLE_TEX2D(_AudioTexture, float2(_AudioLinkDelay, .625 * versionUvMultiplier));
        poiMods.audioLink.w = UNITY_SAMPLE_TEX2D(_AudioTexture, float2(_AudioLinkDelay, .875 * versionUvMultiplier));

        UNITY_BRANCH
        if (_AudioLinkAveraging)
        {
            float uv = saturate(_AudioLinkDelay + _AudioLinkAverageRange * .25);
            poiMods.audioLink.x += UNITY_SAMPLE_TEX2D(_AudioTexture, float2(uv, .125 * versionUvMultiplier));
            poiMods.audioLink.y += UNITY_SAMPLE_TEX2D(_AudioTexture, float2(uv, .375 * versionUvMultiplier));
            poiMods.audioLink.z += UNITY_SAMPLE_TEX2D(_AudioTexture, float2(uv, .625 * versionUvMultiplier));
            poiMods.audioLink.w += UNITY_SAMPLE_TEX2D(_AudioTexture, float2(uv, .875 * versionUvMultiplier));

            uv = saturate(_AudioLinkDelay + _AudioLinkAverageRange * .5);
            poiMods.audioLink.x += UNITY_SAMPLE_TEX2D(_AudioTexture, float2(uv, .125 * versionUvMultiplier));
            poiMods.audioLink.y += UNITY_SAMPLE_TEX2D(_AudioTexture, float2(uv, .375 * versionUvMultiplier));
            poiMods.audioLink.z += UNITY_SAMPLE_TEX2D(_AudioTexture, float2(uv, .625 * versionUvMultiplier));
            poiMods.audioLink.w += UNITY_SAMPLE_TEX2D(_AudioTexture, float2(uv, .875 * versionUvMultiplier));

            uv = saturate(_AudioLinkDelay + _AudioLinkAverageRange * .75);
            poiMods.audioLink.x += UNITY_SAMPLE_TEX2D(_AudioTexture, float2(uv, .125 * versionUvMultiplier));
            poiMods.audioLink.y += UNITY_SAMPLE_TEX2D(_AudioTexture, float2(uv, .375 * versionUvMultiplier));
            poiMods.audioLink.z += UNITY_SAMPLE_TEX2D(_AudioTexture, float2(uv, .625 * versionUvMultiplier));
            poiMods.audioLink.w += UNITY_SAMPLE_TEX2D(_AudioTexture, float2(uv, .875 * versionUvMultiplier));

            uv = saturate(_AudioLinkDelay + _AudioLinkAverageRange);
            poiMods.audioLink.x += UNITY_SAMPLE_TEX2D(_AudioTexture, float2(uv, .125 * versionUvMultiplier));
            poiMods.audioLink.y += UNITY_SAMPLE_TEX2D(_AudioTexture, float2(uv, .375 * versionUvMultiplier));
            poiMods.audioLink.z += UNITY_SAMPLE_TEX2D(_AudioTexture, float2(uv, .625 * versionUvMultiplier));
            poiMods.audioLink.w += UNITY_SAMPLE_TEX2D(_AudioTexture, float2(uv, .875 * versionUvMultiplier));

            poiMods.audioLink /= 5;
        }
    }

    #ifndef OPTIMIZER_ENABLED
        UNITY_BRANCH
        if (_EnableAudioLinkDebug)
        {
            poiMods.audioLink.x = _AudioLinkDebugBass;
            poiMods.audioLink.y = _AudioLinkDebugLowMid;
            poiMods.audioLink.z = _AudioLinkDebugHighMid;
            poiMods.audioLink.w = _AudioLinkDebugTreble;

            if (_AudioLinkDebugAnimate)
            {
                poiMods.audioLink.x *= (sin(_Time.w * 3.1) + 1) * .5;
                poiMods.audioLink.y *= (sin(_Time.w * 3.2) + 1) * .5;
                poiMods.audioLink.z *= (sin(_Time.w * 3.3) + 1) * .5;
                poiMods.audioLink.w *= (sin(_Time.w * 3) + 1) * .5;
            }
            poiMods.audioLinkTextureExists = 1;
        }
        
        UNITY_BRANCH
        if(_AudioLinkTextureVisualization)
        {
            poiMods.audioLinkTexture = UNITY_SAMPLE_TEX2D(_AudioTexture, poiMesh.uv[0]);
        }
    #endif
}

#endif