use anyhow::Context;
use fastly::http::{header, StatusCode, Url};
use fastly::{Backend, Error, Request, Response};

const HTTP_ME_GLITCH: &str = "origin_0";
const HOST_NAME: &str = "http-me.fastly.dev";

#[fastly::main]
fn main(mut req: Request) -> Result<Response, Error> {
    req.set_header(header::HOST, HOST_NAME);

    let mut resp = req.send(HTTP_ME_GLITCH)?;
    let status = resp.get_status();
    println!("Status code {status}");

    if [
        StatusCode::MOVED_PERMANENTLY,
        StatusCode::FOUND,
        StatusCode::PERMANENT_REDIRECT,
    ]
    .contains(&status)
    {
        // Fastly redirect apex domain to "www.fastly.com"
        // Build a dynamic backend according to Location header of the response
        let location = resp
            .get_header_str(header::LOCATION)
            .context("No location header")?;
        println!("Redirected to {location}");

        // Parse location to get:
        // - host name
        // - schema, http or https
        let url = Url::parse(location)?;
        let redirected_host = url.host_str().context("No host info in location")?;

        let mut backend_builder =
            Backend::builder("redirected_backend", redirected_host).override_host(redirected_host);

        if url.scheme() == "https" {
            backend_builder = backend_builder.enable_ssl();
        }

        let backend_redirect = backend_builder.finish().context("Dynamic backend failed")?;

        resp = Request::get(location).send(backend_redirect)?;
    }

    Ok(resp)
}