use fastly::{Backend, Error, Request, Response};
use fastly::experimental::{BackendExt, BackendHealth};
use regex::Regex;

#[fastly::main]
fn main(req: Request) -> Result<Response, Error> {
  let server_region = std::env::var("FASTLY_REGION").unwrap_or_else(|_| "no region env var is available".to_string());
  println!("Region: {}", server_region);
  let re0 = Regex::new(r"(^EU-|^AF-|^South-Africa$)")?;
  let be0 = Backend::from_name("origin_0")?;
  let beresp = if re0.is_match(&server_region) && be0.is_healthy()? == BackendHealth::Healthy {
    println!("Selecting European origin as geographically closest"); 
    req.send("origin_0")?
  } else {
    let re1 = Regex::new(r"(^Asia-|^Asia$|^APAC$)")?;
    let be1 = Backend::from_name("origin_1")?;
    if re1.is_match(&server_region) && be1.is_healthy()? == BackendHealth::Healthy {
      println!("Selecting Asian origin as geographically closest"); 
      req.send("origin_1")?
    } else {
      let be2 = Backend::from_name("origin_2")?;
      if be2.is_healthy()? == BackendHealth::Healthy {
        println!("Selecting American origin as geographically closest"); 
        req.send("origin_2")?
      } else {
        println!("Selecting European origin as fallback");
        req.send("origin_0")?
      }
    }
  };
  Ok(beresp)
}