use genpdf::elements::TableLayout;
use genpdf::{elements, style, Alignment, Document, Size};

pub fn print_class_all() {
    let fon_family = crate::fonts::font_family();
    let mut doc = genpdf::Document::new(fon_family);
    let mut buf: Vec<u8> = Vec::new();
    //print_classes(&mut doc);
    print_classes(&mut doc);
    // doc.render(&mut buf).expect("Render edilemedi");
    // let png_jsarray: zoon::JsValue = js_sys::Uint8Array::from(&buf[..]).into();
    // // the buffer has to be an array of arrays
    // let png_buffer: js_sys::Array = std::iter::IntoIterator::into_iter([png_jsarray]).collect();
    // let mut properties = web_sys::BlobPropertyBag::new();
    // properties.type_("application/pdf");
    // let png_blob =
    //     web_sys::Blob::new_with_buffer_source_sequence_and_options(&png_buffer, &properties)
    //         .unwrap();
    // let url = web_sys::Url::create_object_url_with_blob(&png_blob).unwrap();
    // let window = web_sys::window().unwrap();
    // window.open_with_url(&url).expect("Pdf açılamadı");
}

fn print_classes(doc: &mut genpdf::Document) {
    doc.set_paper_size(Size::new(297, 210));
    doc.set_title(format!("{}", school_name().read()));
    // Customize the pages
    let mut decorator = genpdf::SimplePageDecorator::new();
    decorator.set_margins(10);
    doc.set_page_decorator(decorator);
    let school_name = &*school_name().read();
    doc.set_minimal_conformance();
    doc.set_line_spacing(1.25);
    let mut title = elements::LinearLayout::vertical();
    let mut title_style = style::Style::new();
    title_style.set_bold();
    title_style.set_font_size(20);
    let title_paragraph = elements::Paragraph::default();
    title.push(
        title_paragraph
            .styled_string(school_name, title_style)
            .aligned(Alignment::Center),
    );
    doc.push(title);
    day_row(doc);
}
use crate::tabs::activities::{activities, Activity};
use crate::tabs::classes::{get_classes, Class};
use crate::tabs::generating::Schedule;
use crate::tabs::limitations::limitations_ui::{classes_sched, schedules};
use crate::tabs::{school_hour, school_name};
fn day_row(doc: &mut Document) {
    let mut table = elements::TableLayout::new(vec![8, 8, 8, 8, 8, 8]);
    table.set_cell_decorator(elements::FrameCellDecorator::new(true, true, false));
    let mut row = table.row();
    row.push_element(create_row_title(format!("{}", "Günler")).aligned(Alignment::Center));
    for day in &["Pzt", "Salı", "Çarş", "Per", "Cuma"] {
        row.push_element(create_row_title(format!("{}", day)).aligned(Alignment::Center));
    }
    row.push().expect("Invalid table row");
    let mut row = table.row();
    row.push_element(create_row_title(format!("{}", "Saatler")).aligned(Alignment::Center));
    for _day in &["Pzt", "Salı", "Çarş", "Per", "Cuma"] {
        let mut table2 = elements::TableLayout::new(vec![1, 1, 1, 1, 1, 1, 1]);
        table2.set_cell_decorator(elements::FrameCellDecorator::new(true, false, false));
        let mut row2 = table2.row();
        for i in [1, 2, 3, 4, 5, 6, 7] {
            row2.push_element(create_row_title(i.to_string()));
        }
        row2.push().expect("");
        row.push_element(table2);
    }
    row.push().expect("");
    create_class_row(&mut table);
    doc.push(table);
}

fn create_class_row(table: &mut TableLayout) {
    let clss = &*get_classes().read();
    for c in clss {
        let mut row = table.row();
        row.push_element(create_row_title(format!("{}", &c.1.name)));
        for d in 0..5 {
            let t = create_table_for_row(&c.1, d + 1);
            row.push_element(t);
        }
        row.push().expect("msg");
    }
}
fn create_table_for_row(c: &Class, d: i32) -> TableLayout {
    let acts = activities().read();
    let c_acts: Vec<&Activity> = acts
        .values()
        .filter(|a| a.classes.iter().any(|c2| c2 == &c.id))
        .collect();
    let sch = &*classes_sched().read();
    let sch = sch.get(&c.id).unwrap();
    let l = &*school_hour().read();
    let l = l.parse::<usize>().unwrap();
    let mut table = genpdf::elements::TableLayout::new(vec![1; l]);
    table.set_cell_decorator(elements::FrameCellDecorator::new(true, false, false));
    let mut row = table.row();
    for s in sch {
        // match s {
        //     Some(s) => {
        //         row.push_element(create_row_title(format!("{s:?}")));
        //     }
        //     None => row.push_element(create_row_title2("".to_string())),
        // }
    }
    row.push().expect("msg");
    table
}
fn create_row_title(title: String) -> elements::Paragraph {
    let mut paragraph = elements::Paragraph::default();
    let mut title_style = style::Style::new();
    title_style.bold();
    title_style.set_font_size(10);
    paragraph = paragraph.styled_string(title, title_style);
    paragraph = paragraph.aligned(Alignment::Center);
    paragraph
}

fn create_row_title2(title: String) -> elements::Paragraph {
    let paragraph = elements::Paragraph::default();
    let mut title_style = style::Style::new();
    //title_style.bold();
    title_style.set_font_size(10);
    paragraph.styled_string(title, title_style)
}