use chrono::{Datelike, Local, TimeZone};
use gpui::SharedString;
use nostr_sdk::prelude::*;

pub struct LastSeen(pub Timestamp);

impl LastSeen {
    pub fn ago(&self) -> SharedString {
        let now = Local::now();
        let input_time = Local.timestamp_opt(self.0.as_u64() as i64, 0).unwrap();
        let diff = (now - input_time).num_hours();

        if diff < 24 {
            let duration = now.signed_duration_since(input_time);

            if duration.num_seconds() < 60 {
                "now".to_string().into()
            } else if duration.num_minutes() == 1 {
                "1m".to_string().into()
            } else if duration.num_minutes() < 60 {
                format!("{}m", duration.num_minutes()).into()
            } else if duration.num_hours() == 1 {
                "1h".to_string().into()
            } else if duration.num_hours() < 24 {
                format!("{}h", duration.num_hours()).into()
            } else if duration.num_days() == 1 {
                "1d".to_string().into()
            } else {
                format!("{}d", duration.num_days()).into()
            }
        } else {
            input_time.format("%b %d").to_string().into()
        }
    }

    pub fn human_readable(&self) -> SharedString {
        let now = Local::now();
        let input_time = Local.timestamp_opt(self.0.as_u64() as i64, 0).unwrap();

        if input_time.day() == now.day() {
            format!("Today at {}", input_time.format("%H:%M %p")).into()
        } else if input_time.day() == now.day() - 1 {
            format!("Yesterday at {}", input_time.format("%H:%M %p")).into()
        } else {
            format!(
                "{}, {}",
                input_time.format("%d/%m/%y"),
                input_time.format("%H:%M %p")
            )
            .into()
        }
    }

    pub fn set(&mut self, created_at: Timestamp) {
        self.0 = created_at
    }
}
