use std::iter::zip;

use genpdf::*;

use crate::{
    tabs::{
        get_school, limitations::limitations_ui::teachers_scheds, school_name,
        teachers::get_teachers,
    },
    DAYS,
};

pub fn teachers_prints() {
    let fon_family = crate::fonts::font_family();
    // let font_family = genpdf::fonts::from_files("./fonts", "LiberationSans", None)
    //     .expect("Failed to load font family");
    let mut doc = genpdf::Document::new(fon_family);
    // Change the default settings
    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 mut buf: Vec<u8> = Vec::new();
    print_teachers(&mut doc);
    // doc.render(&mut buf).expect("Render edilemedi");
    doc.render_to_file("ogretmenler.pdf")
        .expect("Failed to write PDF file");
    opener::open(std::path::Path::new("ogretmenler.pdf"));
    // 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_teachers(doc: &mut genpdf::Document) {
    let school_name = &*school_name().read();
    doc.set_minimal_conformance();
    doc.set_line_spacing(1.25);
    let mut decorator = genpdf::SimplePageDecorator::new();
    decorator.set_margins(10 as i32);

    doc.set_page_decorator(decorator);
    doc.set_line_spacing(1.25);
    let teachers = &*get_teachers().read();
    for teacher in teachers {
        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),
        );
        let t_name = format!("{}", teacher.1.name);
        let mut teacher_style = style::Style::new();
        teacher_style.set_italic();
        teacher_style.set_font_size(18);
        title.push(elements::Paragraph::new(&t_name).aligned(Alignment::Center));
        doc.push(title);
        //doc.push(elements::Break::new(1));
        add_row(doc, teacher.1.id);
        doc.push(elements::PageBreak::new());
    }
}
fn add_row(doc: &mut genpdf::Document, c: i32) {
    let len = get_school().read().hour as usize;
    let mut table = elements::TableLayout::new(vec![8; len + 1]);
    table.set_cell_decorator(elements::FrameCellDecorator::new(true, true, false));
    let mut row = table.row();
    row.push_element(
        create_row_title(format!("{} ve {}", "Günler", "Saatler")).aligned(Alignment::Center),
    );
    for hour in vec![1; len].iter().enumerate() {
        row.push_element(
            create_row_title(format!("{}. saat", hour.0 + 1)).aligned(Alignment::Center),
        );
    }
    row.push().expect("Invalid table row");
    let sched = teachers_scheds().read();
    let scheds = sched.get(&c).unwrap();
    for (day, sched) in zip(DAYS, scheds) {
        let mut row = table.row();
        let mut day_row = elements::LinearLayout::vertical();
        day_row.push(create_row_title(day.to_string()).aligned(Alignment::Center));
        let mut line_style = style::Style::new();
        line_style.bold();
        line_style.set_font_size(8);
        // let par = elements::Paragraph::default()
        //     .styled_string("00:00-00:00", line_style)
        //     .aligned(Alignment::Center);
        // day_row.push(par);
        row.push_element(day_row);
        // println!("{:?}", sched);
        for s in sched {
            if let Some(s) = s {
                row.push_element(create_row_title(format!("{:?}", s)))
            } else {
                row.push_element(create_row_title("".to_string()))
            }
        }
        row.push().unwrap();
    }
    doc.push(table);
}

fn create_row_title(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)
}