use std::io::Cursor;

use fastly::{mime, Error, Request, Response};

const BACKEND_NAME: &str = "origin_0";

#[fastly::main]
fn main(req: Request) -> Result<Response, Error> {
    let mut beresp = req.send(BACKEND_NAME)?;

    if let Some(mime) = beresp.get_content_type() {
        match mime.as_ref() {
            "image/jpeg" | "image/png" => annotate_response(&mut beresp)?,
            _ => {}
        }
    }

    Ok(beresp)
}

fn annotate_response(resp: &mut Response) -> Result<(), Error> {
    let reader = exif::Reader::new();

    let image = resp.take_body_bytes();
    let mut data = Cursor::new(image.clone());
    let exif = reader.read_from_container(&mut data)?;

    for f in exif.fields() {
        let tag = format!("{}", f.tag);
        if !tag.contains("(") && !tag.contains(",") && !tag.contains(" ") {
            resp.set_header(
                format!("Edge-Exif-{}", tag),
                format!("{}", f.display_value().with_unit(&exif)),
            );
        }
    }

    resp.get_body_mut().write_bytes(&image);

    Ok(())
}