import { getNetlifyRedirect } from '~/helpers/config-node.js'


const ONE_SECOND = 1
const ONE_MINUTE = 60
const ONE_HOUR = 60 * 60
const TWELVE_HOURS = 12 * ONE_HOUR

function trimTrailingSlash ( url ) {
    return url.replace( /\/$/, '' )
}

// We use a set of top level list pages
// so that our list searching time is as fast as possible
const topLevelListPages = new Set([
    '', // Homepage
    '/games',
    '/devices',
    '/benchmarks',
    '/categories'
])

function getMaxAgeForUrl ( Astro ) {
    const requestUrl = new URL( Astro.request.url )
    const urlPath = trimTrailingSlash( requestUrl.pathname )

    // Top level list pages
    if ( topLevelListPages.has( urlPath ) ) {
        return ONE_MINUTE
    }

    // Kind page
    if ( requestUrl.pathname.startsWith( '/kind/' ) ) {
        return ONE_MINUTE
    }

    return ONE_SECOND
}

export async function applyResponseDefaults ( Astro ) {
    const maxAgeSeconds = getMaxAgeForUrl( Astro )

    // 'stale-while-revalidate' tells Cloudflare to cache the response for X seconds
    // but update the cache in the background
    // so the user always gets a fast and cached response.
    //
    // This also means our Astro SSR entry function on Netlify
    // only gets called from Cloudflare instead of the user's browser
    // so that our actual number of requests to Netlify are minimized.
    //
    // Cache-Control: s-maxage=1, stale-while-revalidate
    Astro.response.headers.set( 'Cache-Control', `s-maxage=${ maxAgeSeconds }, stale-while-revalidate` )
}


export async function catchRedirectResponse ( Astro ) {
    const requestUrl = new URL( Astro.request.url )

    let netlifyRedirectUrl = null

    try {
        netlifyRedirectUrl = await getNetlifyRedirect( requestUrl.pathname )
    } catch ( error ) {
        console.warn( `Skipping redirect lookup for ${ requestUrl.pathname }`, error )
    }

    // console.log('netlifyRedirectUrl', netlifyRedirectUrl)

    if ( netlifyRedirectUrl !== null ) {
        return Astro.redirect( netlifyRedirectUrl.to )
    }

    return null
}

