use genpdf::elements::TableLayout;
use genpdf::{elements, style, Alignment, Document, Size};
use shared::msgs::activities::FullActivity;
use shared::msgs::teachers::Teacher;
use shared::msgs::timetables::Schedule;
use crate::app::timetables::{selected_timetable_hour, schedules, activities, teachers, classes};
use crate::app::timetables::school;
pub fn print_teacher_all(){
let fon_family = crate::fonts::font_family();
let mut doc = genpdf::Document::new(fon_family);
let mut buf: Vec<u8> = Vec::new();
print_teachers(&mut doc);
doc.render(&mut buf).expect("Render edilemedi");
let png_jsarray: zoon::JsValue = js_sys::Uint8Array::from(&buf[..]).into();
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){
doc.set_paper_size(Size::new(297,210));
doc.set_title(format!("{}", school().get_cloned().unwrap().name));
let mut decorator = genpdf::SimplePageDecorator::new();
decorator.set_margins(10);
doc.set_page_decorator(decorator);
let school_name = school().get_cloned().unwrap().name;
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::i18n::t_s;
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!("{}", t_s!("days"))).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!("{}", t_s!("hours"))).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_teacher_row(&mut table);
doc.push(table);
}
fn create_teacher_row(table: &mut TableLayout){
let tchrs = teachers().lock_mut().to_vec();
for t in tchrs{
let mut row = table.row();
row.push_element(create_row_title(format!("{} {}",t.first_name, t.last_name)));
for d in 0..5{
let t = create_table_for_row(&t, d+1);
row.push_element(t);
}
row.push().expect("msg");
}
}
fn create_table_for_row(t: &Teacher, d: i32)-> TableLayout{
let acts = activities().lock_mut().to_vec();
let t_acts: Vec<&FullActivity> = acts.iter().filter(|a| a.teachers.iter().any(|c2| c2 == &t.id)).collect();
let sch = schedules().lock_mut().to_vec();
let sch: Vec<&Schedule> = sch.iter().filter(|s| t_acts.iter().any(|a| a.id == s.activity)).collect();
let l = selected_timetable_hour().lock_mut().to_vec();
let mut table = genpdf::elements::TableLayout::new(vec![1; l.len()]);
table.set_cell_decorator(elements::FrameCellDecorator::new(true, false, false));
let mut row = table.row();
for i in 0..l.len(){
let s = sch.iter().find(|s| s.day_id == d && s.hour as usize == i);
match s{
Some(s) => {
let a = t_acts.iter().find(|a| a.id == s.activity).unwrap();
let cls = classes().lock_mut().to_vec();
let cls = cls.iter().find(|c| a.classes.iter().any(|c2| c2 == &c.id )).unwrap();
let cls = format!("{}{}", cls.kademe, cls.sube);
let cls = cls.chars().take(2).collect::<String>();
row.push_element(create_row_title(cls));
}
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.set_font_size(10);
paragraph.styled_string(title, title_style)
}