use fastly::{Error, Request, Response};
use hashring::HashRing;
use std::collections::HashMap;

fn parse(cookie_string: &str) -> HashMap<&str, &str> {
    cookie_string
        .split("; ")
        .filter_map(|kv| {
            kv.find('=').map(|index| {
                let (key, value) = kv.split_at(index);
                let key = key.trim().trim();
                let value = value[1..].trim();
                (key, value)
            })
        })
        .collect()
}

#[fastly::main]
fn main(req: Request) -> Result<Response, Error> {
  //Initialize hashring
  let mut ring: HashRing <&str> = HashRing::new();
  ring.add("origin_0");
  ring.add("origin_1");
  ring.add("origin_2");
  //use cookie to get hash
  let cookie_header = req.get_header_str("cookie").unwrap_or_default();
  let cookie = parse(&cookie_header);
  let user_id = cookie.get("user-id").unwrap();
  let backend = ring.get(user_id).unwrap();

  //debugging...
  println!("user id: {}", user_id);
  println!("Sending to backend {} ...", backend);
  
  Ok(req.send(*backend)?)
}