use chrono::prelude::*;
use fastly::geo::geo_lookup;
use fastly::{Error, Request, Response};

#[fastly::main]
fn main(req: Request) -> Result<Response, Error> {
   // setting date/time variables
    let dt = Utc.with_ymd_and_hms(2014, 11, 28, 12, 0, 9).unwrap();
    let fixed_dt = dt.with_timezone(&FixedOffset::east_opt(9 * 3600).unwrap());

    // you can also take offset from timezone of connected user
    let geo =  req.get_client_ip_addr().and_then(geo_lookup).unwrap();
    match geo.utc_offset() {
        Some(fastly_offset) => {
            let fixed_offset = FixedOffset::east_opt(fastly_offset.whole_seconds()).unwrap();
            let _fixed_dt = dt.with_timezone(&fixed_offset);
        }
        None => {println!("The geolocation database does not have a time zone offset for this IP address");}
    }
     
    // setting time by time string parsing
    // method 1
    let tt = "2014-11-28T12:00:09Z".parse::<DateTime<Utc>>().unwrap();
    assert_eq!(tt.clone(), dt.clone());

    let tt = "2014-11-28T21:00:09+09:00".parse::<DateTime<Utc>>().unwrap();
    assert_eq!(tt.clone(), dt.clone());
    
    let tt = "2014-11-28T21:00:09+09:00".parse::<DateTime<FixedOffset>>().unwrap();
    assert_eq!(tt, fixed_dt.clone());

    // method 2
    let tt = DateTime::parse_from_str("2014-11-28 21:00:09 +09:00", "%Y-%m-%d %H:%M:%S %z").unwrap();
    assert_eq!(tt.clone(), fixed_dt.clone());
    
    let tt = DateTime::parse_from_rfc2822("Fri, 28 Nov 2014 21:00:09 +0900").unwrap();
    assert_eq!(tt.clone(), fixed_dt.clone());
    
    let tt = DateTime::parse_from_rfc3339("2014-11-28T21:00:09+09:00").unwrap();
    assert_eq!(tt.clone(), fixed_dt.clone());

    // method 3
    let tt = NaiveDateTime::parse_from_str("2014-11-28 12:00:09", "%Y-%m-%d %H:%M:%S").unwrap().and_utc();
    assert_eq!(tt.clone(), dt.clone());

    let tt = NaiveDateTime::parse_from_str("Fri Nov 28 12:00:09 2014", "%a %b %e %T %Y").unwrap().and_utc();
    assert_eq!(tt.clone(), dt.clone());

    // time formatting

    // RFC 2822 or RFC 5322
    assert_eq!(dt.to_rfc2822(), "Fri, 28 Nov 2014 12:00:09 +0000");
    // RFC 3339
    assert_eq!(dt.to_rfc3339(), "2014-11-28T12:00:09+00:00");
    // Unix EPOCH format
    assert_eq!(dt.format("%s").to_string(), "1417176009");
    // Other options
    assert_eq!(dt.to_string(), "2014-11-28 12:00:09 UTC");
    assert_eq!(dt.format("%Y-%m-%d %H:%M:%S").to_string(), "2014-11-28 12:00:09");
    assert_eq!(dt.format("%a %b %e %T %Y").to_string(), "Fri Nov 28 12:00:09 2014");

    Ok(Response::new())
}