use chrono::Datelike;
use glib::Object;
use gtk::{prelude::*, subclass::prelude::*};
use ifc::IFC;
use std::{cell::RefCell, rc::Rc};

pub struct DatePrivate {
    date: Rc<RefCell<IFC>>,
    label: Rc<RefCell<gtk::Label>>,
}

impl Default for DatePrivate {
    fn default() -> Self {
        let date = chrono::Local::now().date_naive();
        let year = date.year();
        let date = date.with_year(year + 10000).unwrap();
        Self {
            date: Rc::new(RefCell::new(IFC::from(date))),
            label: Rc::new(RefCell::new(gtk::Label::new(None))),
        }
    }
}

#[glib::object_subclass]
impl ObjectSubclass for DatePrivate {
    const NAME: &'static str = "Date";
    type Type = Date;
    type ParentType = gtk::Box;
}

impl ObjectImpl for DatePrivate {}
impl WidgetImpl for DatePrivate {}
impl BoxImpl for DatePrivate {}

glib::wrapper! {
    pub struct Date(ObjectSubclass<DatePrivate>) @extends gtk::Box, gtk::Widget;
}

impl Default for Date {
    fn default() -> Self {
        let s: Self = Object::builder().build();
        s.set_margin_bottom(8);
        s.set_margin_top(8);
        s.set_margin_start(8);
        s.set_margin_end(8);

        s.append(&*s.imp().label.borrow());

        s.redraw();
        s
    }
}

impl Date {
    pub fn update_date(&self, date: IFC) {
        *self.imp().date.borrow_mut() = date;
        self.redraw();
    }

    fn redraw(&self) {
        let date = self.imp().date.borrow().clone();
        self.imp().label.borrow_mut().set_text(&format!(
            "{:?}, {:?} {}, {}",
            date.weekday(),
            date.month(),
            date.day(),
            date.year()
        ));
    }
}