use activity_form::{
    act_form, add_activity, filtered_teachers, find_new_act_id, lectures_ui,
    teachers_ui::filter_teacher_text, update_activity_data,
};
use eframe::egui::{
    self, mutex::RwLock, vec2, Align2, Button, Color32, ComboBox, Frame, Label, RichText, Rounding,
    Stroke, TextEdit,
};
use egui::{CornerRadius, Id};
use egui_extras::{Column, TableBody, TableBuilder};
use egui_flex::{item, Flex};
use serde::{Deserialize, Serialize};
use std::{
    collections::{BTreeMap, HashMap},
    fmt::Debug,
    fs::File,
    io::{Read, Write},
    iter::zip,
    sync::{Arc, OnceLock},
};

use super::{
    classes::{classes_acts, classes_lists_ui, create_classes_acts, get_classes, selected_class},
    classrooms::get_classrooms,
    generating::{act_total_classes, act_total_teachers, data},
    get_page, get_school,
    lectures::get_lectures,
    limitations::limitations_ui::{classes_limitations, teachers_limitations},
    panel_buttons,
    teachers::{
        create_teacher_acts, get_teachers, selected_teacher, teachers_acts, teachers_list_ui,
    },
    SubPage,
};
pub mod activity_form;
#[derive(Hash, Clone, Default, Serialize, PartialEq, Eq, PartialOrd, Ord, Deserialize)]
pub struct Activity {
    pub id: i32,
    pub lecture: i32,
    pub classes: Vec<i32>,
    pub teachers: Vec<i32>,
    pub hour: usize,
    pub classroom: Vec<i32>,
    pub no_limit: bool,
    pub partners: Vec<i32>,
}

impl Activity {
    pub fn lectures_name(&self) -> String {
        let mut activity = "".to_string();
        activity.push_str(&get_lec_short_name(self.lecture));
        activity.push_str(" ");
        for p_id in &self.partners {
            let p_act = activities().read().clone();
            let p_act = p_act.get(&p_id).unwrap();
            activity.push_str(&get_lec_short_name(p_act.lecture));
        }
        activity.trim().to_string()
    }
    pub fn classes_name(&self) -> String {
        let mut activity = "".to_string();
        for c in &self.classes {
            activity.push_str(&get_class_name(*c));
        }
        activity.push_str(" ");
        for p_id in &self.partners {
            let p_act = activities().read().clone();
            let p_act = p_act.get(&p_id).unwrap();
            for c in &p_act.classes {
                activity.push_str(&get_class_name(*c));
            }
        }
        activity.trim().to_string()
    }
    pub fn teachers_short_name(&self) -> String {
        let mut activity = "".to_string();
        for t in &self.teachers {
            activity.push_str(&get_teacher_name(*t));
        }
        activity.push_str(" ");
        for p_id in &self.partners {
            let p_act = activities().read().clone();
            let p_act = p_act.get(&p_id).unwrap();
            for t in &p_act.teachers {
                activity.push_str(&get_teacher_name(*t));
            }
        }
        activity.trim().to_string()
    }
    pub fn teachers_name(&self) -> String {
        let mut activity = "".to_string();
        for t in &self.teachers {
            activity.push_str(&get_teacher_name(*t));
        }
        activity.push_str(" ");
        for p_id in &self.partners {
            let p_act = activities().read().clone();
            let p_act = p_act.get(&p_id).unwrap();
            for t in &p_act.teachers {
                activity.push_str(&get_teacher_name(*t));
            }
        }
        activity.trim().to_string()
    }
    fn classes_lims(&self) -> Option<Vec<Vec<Vec<bool>>>> {
        let mut c_availables = vec![];
        let act_classes = act_total_classes().read();

        let Some(classes) = act_classes.get(&self.id) else {
            return None;
        };
        for class in classes {
            let c = &*classes_limitations().read();
            if let Some(c) = c.get(class) {
                c_availables.push(c.limitations.clone());
            }
        }
        Some(c_availables)
    }
    pub fn classes_available(&self, hour: usize, day: usize) -> bool {
        let Some(lims) = self.classes_lims() else {
            return false;
        };
        hour + self.hour <= get_school().read().hour
            && (hour..hour + self.hour as usize).all(|h| lims.iter().all(|ta| ta[day][h]))
    }
    fn teachers_lims(&self) -> Option<Vec<Vec<Vec<bool>>>> {
        let mut t_availables = vec![];
        let act_teachers = act_total_teachers().read();

        let Some(teachers) = act_teachers.get(&self.id) else {
            return None;
        };
        for teacher in teachers {
            let t = &*teachers_limitations().read();
            if let Some(t) = t.get(teacher) {
                t_availables.push(t.limitations.clone());
            }
        }
        Some(t_availables)
    }
    pub fn teachers_available(&self, hour: usize, day: usize) -> bool {
        let Some(lims) = self.teachers_lims() else {
            return false;
        };
        hour + self.hour <= get_school().read().hour
            && (hour..hour + self.hour as usize).all(|h| lims.iter().all(|ta| ta[day][h]))
    }
}

impl Debug for Activity {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        let name = format!(
            "{}, {} {} {} - {}",
            self.id,
            self.lectures_name(),
            self.teachers_short_name(),
            self.classes_name(),
            self.hour
        );
        write!(f, "{}", name)
    }
}

pub fn save_activities() {
    std::thread::spawn(move || {
        let acts = &*activities().read();
        // let acts = acts.iter().map(|a| a.1.clone()).collect::<Vec<Activity>>();
        // let mut map = BTreeMap::new();
        // for a in acts {
        //     map.insert(a.id, a.clone());
        // }
        let mut f = File::create("./db/activities.json").unwrap();
        f.write_all(serde_json::to_string(&acts).unwrap().as_bytes())
            .expect("Aktiviteler yazılamadı");
    });
}
fn read_activities() -> BTreeMap<i32, Activity> {
    let f = File::open("./db/activities.json");
    if let Ok(mut f) = f {
        let mut content: String = String::new();
        f.read_to_string(&mut content).unwrap();
        let cls: BTreeMap<i32, Activity> = serde_json::from_str(content.as_str()).unwrap();
        // cls.sort_by(|a, b| b.id.cmp(&a.id));
        return cls;
    }
    BTreeMap::new()
}
pub fn activities() -> &'static Arc<RwLock<BTreeMap<i32, Activity>>> {
    static PAGE: OnceLock<Arc<RwLock<BTreeMap<i32, Activity>>>> = OnceLock::new();
    PAGE.get_or_init(|| Arc::new(RwLock::new(read_activities())))
}
pub fn classes_acts_hours() -> &'static Arc<RwLock<BTreeMap<i32, usize>>> {
    static PAGE: OnceLock<Arc<RwLock<BTreeMap<i32, usize>>>> = OnceLock::new();
    PAGE.get_or_init(|| Arc::new(RwLock::new(create_classes_hours())))
}
pub fn teachers_acts_hours() -> &'static Arc<RwLock<BTreeMap<i32, usize>>> {
    static PAGE: OnceLock<Arc<RwLock<BTreeMap<i32, usize>>>> = OnceLock::new();
    PAGE.get_or_init(|| Arc::new(RwLock::new(create_teachers_hours())))
}
pub fn selected_act() -> &'static Arc<RwLock<i32>> {
    static LECTURES: OnceLock<Arc<RwLock<i32>>> = OnceLock::new();
    LECTURES.get_or_init(|| Arc::new(RwLock::new(-1)))
}
pub fn partnered_act() -> &'static Arc<RwLock<HashMap<i32, i32>>> {
    static LECTURES: OnceLock<Arc<RwLock<HashMap<i32, i32>>>> = OnceLock::new();
    LECTURES.get_or_init(|| Arc::new(RwLock::new(create_partnered_act())))
}

pub fn create_partnered_act() -> HashMap<i32, i32> {
    let acts = &*activities().read();
    let mut map = HashMap::new();
    for a in acts {
        for id in &a.1.partners {
            map.insert(id.clone(), a.1.id);
        }
    }
    map
}
pub fn show_add_class_form() -> &'static Arc<RwLock<bool>> {
    static LECTURES: OnceLock<Arc<RwLock<bool>>> = OnceLock::new();
    LECTURES.get_or_init(|| Arc::new(RwLock::new(false)))
}
pub fn set_show_class_form() {
    let stat = *show_add_class_form().read();
    std::thread::spawn(move || {
        *show_add_class_form().write() = !stat;
    });
}
pub fn show_add_classroom_form() -> &'static Arc<RwLock<bool>> {
    static LECTURES: OnceLock<Arc<RwLock<bool>>> = OnceLock::new();
    LECTURES.get_or_init(|| Arc::new(RwLock::new(false)))
}
pub fn set_show_classroom_form() {
    let stat = *show_add_classroom_form().read();
    std::thread::spawn(move || {
        *show_add_classroom_form().write() = !stat;
    });
}
pub fn show_add_teacher_form() -> &'static Arc<RwLock<bool>> {
    static LECTURES: OnceLock<Arc<RwLock<bool>>> = OnceLock::new();
    LECTURES.get_or_init(|| Arc::new(RwLock::new(false)))
}
pub fn select_class_for_move() -> &'static Arc<RwLock<Option<i32>>> {
    static LECTURES: OnceLock<Arc<RwLock<Option<i32>>>> = OnceLock::new();
    LECTURES.get_or_init(|| Arc::new(RwLock::new(None)))
}
pub fn class_name_for_move() -> &'static Arc<RwLock<String>> {
    static LECTURES: OnceLock<Arc<RwLock<String>>> = OnceLock::new();
    LECTURES.get_or_init(|| Arc::new(RwLock::new("".to_string())))
}
pub fn set_show_teacher_form() {
    let stat = show_add_teacher_form().read().clone();
    std::thread::spawn(move || {
        *show_add_teacher_form().write() = !stat;
    });
}
pub fn show_add_partner_form() -> &'static Arc<RwLock<bool>> {
    static LECTURES: OnceLock<Arc<RwLock<bool>>> = OnceLock::new();
    LECTURES.get_or_init(|| Arc::new(RwLock::new(false)))
}
pub fn set_partner_form() {
    let stat = show_add_partner_form().read().clone();
    std::thread::spawn(move || {
        *show_add_partner_form().write() = !stat;
    });
}

fn create_classes_hours() -> BTreeMap<i32, usize> {
    let acts = &*activities().read();
    let mut cah = BTreeMap::new();
    for c in &*get_classes().read() {
        let c_acts = acts
            .iter()
            .filter(|a| a.1.classes.iter().any(|ca| ca == &c.1.id))
            .fold(0, |acc, a| acc + a.1.hour);
        cah.insert(c.1.id, c_acts);
    }
    cah
}
fn create_teachers_hours() -> BTreeMap<i32, usize> {
    let acts = &*activities().read();
    let mut cah = BTreeMap::new();
    for c in &*get_teachers().read() {
        let c_acts = acts
            .iter()
            .filter(|a| a.1.teachers.iter().any(|ca| ca == &c.1.id))
            .fold(0, |acc, a| acc + a.1.hour);
        cah.insert(c.1.id, c_acts);
    }
    cah
}
pub fn del_states() -> &'static Arc<RwLock<Vec<bool>>> {
    static SELECTED: OnceLock<Arc<RwLock<Vec<bool>>>> = OnceLock::new();
    let len = activities().read().len();
    SELECTED.get_or_init(|| Arc::new(RwLock::new(vec![false; len])))
}
pub fn get_lec_name(id: i32) -> String {
    let lec = get_lectures()
        .read()
        .clone()
        .into_iter()
        .find(|l| l.1.id == id);
    if let Some(lec) = lec {
        return lec.1.name;
    }
    "".to_string()
}
pub fn get_lec_short_name(id: i32) -> String {
    let lec = get_lectures()
        .read()
        .clone()
        .into_iter()
        .find(|l| l.1.id == id);
    if let Some(lec) = lec {
        return lec.1.short_name;
    }
    "".to_string()
}
pub fn get_classes_name(ids: &[i32]) -> String {
    let mut name = "".to_string();
    for i in ids {
        if let Some(c) = get_classes().read().get(i) {
            name.push_str(&c.name);
            name.push_str(" ");
        }
    }
    name.trim().to_string()
}
pub fn get_class_name(id: i32) -> String {
    let mut name = "".to_string();
    if let Some(c) = get_classes().read().get(&id) {
        name.push_str(&c.name);
    }
    name.trim().to_string()
}
pub fn get_act_classrooms_name(id: i32) -> String {
    let mut name = "".to_string();
    if let Some(c) = get_classrooms().read().get(&id) {
        name.push_str(&c.name);
    }
    name.trim().to_string()
}
pub fn get_teachers_name(ids: &[i32]) -> String {
    let mut name = "".to_string();
    for i in ids {
        if let Some(c) = get_teachers().read().get(i) {
            name.push_str(&c.short_name);
            name.push_str("\n");
        }
    }
    name.trim().to_string()
}
pub fn get_teacher_name(id: i32) -> String {
    let mut name = "".to_string();
    if let Some(c) = get_teachers().read().get(&id) {
        name.push_str(&c.short_name);
    }
    name.trim().to_string()
}
pub fn get_teachers_short_name(ids: &[i32]) -> String {
    let mut name = "".to_string();
    for i in ids {
        if let Some(c) = get_teachers().read().get(i) {
            name.push_str(&c.short_name);
            name.push_str(" ");
        }
    }
    name.trim().to_string()
}

fn del_act(id: i32) {
    std::thread::spawn(move || {
        activities().write().remove(&id);
        let len = activities().read().len();
        *del_states().write() = vec![false; len];
        *classes_acts().write() = create_classes_acts();
        *classes_acts_hours().write() = create_classes_hours();
        *teachers_acts().write() = create_teacher_acts();
        *teachers_acts_hours().write() = create_teachers_hours();
        save_activities();
    });
}
pub fn activities_ui(ui: &mut egui::Ui) {
    egui::TopBottomPanel::top("top_panel")
        .resizable(true)
        .default_height(60.)
        .height_range(50.0..=350.0)
        .show_inside(ui, |ui| {
            panel_buttons(ui);
        });
    home_ui(ui);
}

pub fn home_ui(ui: &mut egui::Ui) {
    egui::SidePanel::left("left_panel")
        .resizable(true)
        .default_width(250.0)
        .width_range(200.0..=500.0)
        .show_inside(ui, |ui| {
            if let SubPage::Teachers = *get_page().read() {
                teachers_list_ui(ui);
            } else {
                classes_lists_ui(ui);
            }
        });
    egui::CentralPanel::default().show_inside(ui, |ui| {
        act_form(ui);
        ui.horizontal(|ui| {
            // ui.vertical(|ui| {
            //     ui.add_sized(vec2(250., 50.), Label::new("Atanmamış dersler"));
            //     not_put_acts(ui);
            // });
            ui.separator();
            ui.vertical(|ui| {
                list_activities_ui(ui);
            });
        });
    });
}
pub fn list_activities_ui(ui: &mut egui::Ui) {
    add_more_teachers_list(ui);
    add_more_classes_list(ui);
    add_more_classroom_list(ui);
    add_partner_form(ui);
    lectures_ui::select_lecture_ui(ui);
    let w = ui.available_width();
    if ui
        .add_sized(vec2(w, 50.), Button::new("Ders Ata"))
        .clicked()
    {
        *lectures_ui::show_lectures().write() = true;
    };
    match *get_page().read() {
        SubPage::Teachers => {
            if let Some(t) = *selected_teacher().read() {
                let text = get_teachers_name(&[t]);
                let hour = *teachers_acts_hours().read().get(&t).unwrap_or(&0);
                if let Some(acts) = teachers_acts().write().get_mut(&t) {
                    list_acts_table(ui, acts);
                }
                ui.separator();
                ui.add(Label::new(
                    RichText::new(format!(
                        "{} adlı öğretmene atanan toplam ders yükü: {} saat",
                        text, hour
                    ))
                    .size(18.),
                ));
            }
        }
        SubPage::Classes => {
            if let Some(c) = *selected_class().read() {
                let text = get_classes_name(&[c]);
                let hour = *classes_acts_hours().read().get(&c).unwrap_or(&0);
                if let Some(acts) = classes_acts().write().get(&c) {
                    list_acts_table(ui, acts);
                }
                ui.separator();
                ui.horizontal_centered(|ui| {
                    ui.add(Label::new(
                        RichText::new(format!(
                            "{} sınıfına atanan toplam ders yükü: {} saat",
                            text, hour
                        ))
                        .size(18.),
                    ));
                    ui.add_space(50.);
                    ComboBox::new("move_classes", "")
                        .width(50.)
                        .selected_text(&*class_name_for_move().read())
                        .show_ui(ui, |ui| {
                            for c in &*get_classes().read() {
                                let cl = c.1.clone();
                                if ui.button(&c.1.name).clicked() {
                                    std::thread::spawn(move || {
                                        *class_name_for_move().write() = cl.name.clone();
                                        *select_class_for_move().write() = Some(cl.id);
                                    });
                                };
                            }
                        });
                    if ui
                        .add_sized(vec2(100., 30.), Button::new("Seçili Sınıfa Aktar"))
                        .clicked()
                    {
                        std::thread::spawn(move || {
                            if let Some(id) = *select_class_for_move().read() {
                                if let Some(acts) = classes_acts().read().get(&c) {
                                    for a in acts {
                                        let mut a = a.clone();
                                        a.classes.iter_mut().for_each(|c2| {
                                            if c == *c2 {
                                                *c2 = id;
                                            }
                                        });
                                        a.id = find_new_act_id();
                                        add_activity(a);
                                    }
                                }
                            }
                        });
                    }
                });
            }
        }
    };
    ui.separator();
}
pub fn list_acts_table(ui: &mut egui::Ui, acts: &Vec<Activity>) {
    TableBuilder::new(ui)
        .column(Column::initial(50.).resizable(true))
        .column(Column::initial(250.).resizable(true))
        .column(Column::initial(230.).resizable(true))
        .column(Column::initial(100.).resizable(true))
        .column(Column::initial(50.).resizable(true))
        .column(Column::initial(50.).resizable(true))
        .column(Column::initial(120.).resizable(true))
        .column(Column::initial(120.).resizable(true))
        .column(Column::initial(50.).resizable(true))
        .striped(true)
        .min_scrolled_height(800.)
        .auto_shrink(false)
        // .column(Column::remainder())
        .header(50., |mut header| {
            header.col(|ui| {
                ui.heading("İd");
            });
            header.col(|ui| {
                ui.heading("Ders");
            });
            header.col(|ui| {
                ui.heading("Öğretmenler");
            });
            header.col(|ui| {
                ui.heading("Sınıflar");
            });
            header.col(|ui| {
                ui.heading("Saat");
            });
            header.col(|ui| {
                ui.heading("Limit");
            });
            header.col(|ui| {
                ui.heading("Derslik");
            });
            header.col(|ui| {
                ui.heading("Ortak Dersler");
            });
        })
        .body(|body| table_body(body, acts));
}
fn table_body(mut body: TableBody, acts: &Vec<Activity>) {
    let stats = &*del_states().read();
    for (index, (act, stat)) in zip(acts, stats).enumerate() {
        body.row(40., |mut row| {
            row.col(|ui| {
                ui.horizontal_centered(|ui| {
                    if !*stat {
                        if ui.button("Sil").clicked() {
                            std::thread::spawn(move || {
                                del_states().write()[index] = true;
                            });
                        };
                        if ui.button("Çoğalt").clicked() {
                            let mut a = act.clone();
                            a.id = find_new_act_id();
                            add_activity(a);
                        };
                        if ui.button("Böl").clicked() {
                            let id = act.id;
                            let hour = act.hour;
                            std::thread::spawn(move || {
                                let a = &mut *activities().write();
                                let a = a.get_mut(&id);
                                if let Some(a) = a {
                                    a.hour = hour - a.hour / 2;
                                }
                            })
                            .join()
                            .unwrap();
                            let mut a = act.clone();
                            a.id = find_new_act_id();
                            a.hour = a.hour / 2;
                            add_activity(a);
                            save_activities();
                            // println!("a");
                        };
                        if index > 0 && acts[index - 1].lecture == act.lecture {
                            if ui.button("").clicked() {
                                let id = act.id;
                                let id2 = acts[index - 1].clone();
                                let hour = id2.hour;
                                let id2 = id2.id;
                                std::thread::spawn(move || {
                                    let a = &mut *activities().write();
                                    a.remove(&id2);
                                    let a = a.get_mut(&id);
                                    if let Some(a) = a {
                                        a.hour = a.hour + hour;
                                    }
                                    save_activities();
                                    update_activity_data();
                                });
                                // let mut a = act.clone();
                                // a.id = find_new_act_id();
                                // add_activity(a);
                            };
                        }
                    } else {
                        ui.horizontal_centered(|ui| {
                            if ui
                                .button(RichText::new("Sil").color(Color32::DARK_RED))
                                .clicked()
                            {
                                del_act(act.id);
                            };
                            if ui
                                .button(RichText::new("Vazgeç").color(Color32::DARK_RED))
                                .clicked()
                            {
                                std::thread::spawn(move || {
                                    del_states().write()[index] = false;
                                });
                            };
                        });
                    }
                });
            });
            row.col(|ui| {
                ui.horizontal_centered(|ui| {
                    ui.label(RichText::new(get_lec_name(act.lecture)).size(
                        if act.id == *selected_act().read() {
                            24.
                        } else {
                            16.
                        },
                    ));
                });
            });
            row.col(|ui| {
                act_teachers_row(ui, &act);
            });
            row.col(|ui| {
                act_classes_row(ui, &act);
            });
            row.col(|ui| {
                ui.horizontal_centered(|ui| {
                    ui.label(act.hour.to_string());
                });
            });
            row.col(|ui| {
                if ui.checkbox(&mut act.no_limit.clone(), "").changed() {
                    change_no_limit(act.id);
                };
            });
            row.col(|ui| {
                act_classrooms_row(ui, &act);
            });
            row.col(|ui| {
                ui.horizontal_wrapped(|ui| {
                    act_partners_row(ui, &act);
                });
            });
        });
    }
}
fn act_partners_row(ui: &mut egui::Ui, act: &Activity) {
    let ids = &act.partners;
    ui.horizontal_centered(|ui| {
        for id in ids {
            let a = activities().read().clone();
            let a = a.get(&id).unwrap();
            let fmt = format!(
                "{}-{}",
                get_lec_name(a.lecture),
                get_teachers_name(&a.teachers)
            );
            Frame::new()
                .corner_radius(CornerRadius::same(5))
                .stroke(Stroke::new(0.5, Color32::GRAY))
                .inner_margin(2.)
                .show(ui, |ui| {
                    ui.label(fmt);
                    let b = Button::new("")
                        .stroke(Stroke::NONE)
                        .fill(Color32::default());
                    if ui
                        .add(b)
                        .on_hover_cursor(egui::CursorIcon::PointingHand)
                        .clicked()
                    {
                        del_partner(act.id, a.id);
                    };
                });
        }
    });
    if partnered_act().read().get(&act.id).is_none()
        && ui
            .button(RichText::new("").color(Color32::LIGHT_BLUE))
            .clicked()
    {
        *selected_act().write() = act.id;
        set_partner_form();
    }
}
fn act_teachers_row(ui: &mut egui::Ui, act: &Activity) {
    ui.horizontal_centered(|ui| {
        ui.horizontal(|ui| {
            for t in &act.teachers {
                Frame::new()
                    .corner_radius(CornerRadius::same(5))
                    .stroke(Stroke::new(0.5, Color32::GRAY))
                    .show(ui, |ui| {
                        ui.label(get_teacher_name(*t));
                        let b = Button::new("")
                            .stroke(Stroke::NONE)
                            .fill(Color32::default());
                        if ui
                            .add(b)
                            .on_hover_cursor(egui::CursorIcon::PointingHand)
                            .clicked()
                        {
                            remove_teacher(*t, act.id);
                        };
                    });
            }
        });
        if ui
            .button(RichText::new("").color(Color32::LIGHT_BLUE))
            .clicked()
        {
            *selected_act().write() = act.id;
            set_show_teacher_form();
        }
    });
}

fn act_classes_row(ui: &mut egui::Ui, act: &Activity) {
    ui.horizontal_centered(|ui| {
        ui.horizontal(|ui| {
            for c in &act.classes {
                Frame::new()
                    .corner_radius(CornerRadius::same(5))
                    .stroke(Stroke::new(0.5, Color32::GRAY))
                    .show(ui, |ui| {
                        ui.label(get_class_name(*c));
                        let b = Button::new("")
                            .stroke(Stroke::NONE)
                            .fill(Color32::default());
                        if ui
                            .add(b)
                            .on_hover_cursor(egui::CursorIcon::PointingHand)
                            .clicked()
                        {
                            remove_class(*c, act.id);
                        };
                    });
            }
        });
        if ui
            .button(RichText::new("").color(Color32::LIGHT_BLUE))
            .clicked()
        {
            *selected_act().write() = act.id;
            *show_add_class_form().write() = true;
        }
    });
}
fn act_classrooms_row(ui: &mut egui::Ui, act: &Activity) {
    ui.horizontal_centered(|ui| {
        ui.horizontal(|ui| {
            for c in &act.classroom {
                Frame::new()
                    .corner_radius(CornerRadius::same(5))
                    .stroke(Stroke::new(0.5, Color32::GRAY))
                    .show(ui, |ui| {
                        ui.label(get_act_classrooms_name(*c));
                        let b = Button::new("")
                            .stroke(Stroke::NONE)
                            .fill(Color32::default());
                        if ui
                            .add(b)
                            .on_hover_cursor(egui::CursorIcon::PointingHand)
                            .clicked()
                        {
                            remove_classroom(*c, act.id);
                        };
                    });
            }
        });
        if ui
            .button(RichText::new("").color(Color32::LIGHT_BLUE))
            .clicked()
        {
            *selected_act().write() = act.id;
            set_show_classroom_form();
        }
    });
}
fn add_more_classes_list(ui: &mut egui::Ui) {
    let id = *selected_act().read();
    egui::Window::new("Select Class")
        .open(&mut *show_add_class_form().write())
        .show(ui.ctx(), |ui| {
            // classes_ui(ui);
            Flex::horizontal()
                .align_items(egui_flex::FlexAlign::Stretch)
                .align_items_content(Align2::CENTER_CENTER)
                .gap(vec2(1., 1.0))
                .show(ui, |flex| {
                    for c in &*get_classes().read() {
                        flex.add_ui(item().grow(5.), |ui| {
                            // let b = Button::new(&c.1.name);
                            if ui
                                .add_sized(vec2(50., 30.), Button::new(&c.1.name))
                                .clicked()
                            {
                                add_more_class(c.1.id, id);
                            }
                        });
                    }
                });
        });
}
fn add_more_classroom_list(ui: &mut egui::Ui) {
    let id = *selected_act().read();
    egui::Window::new("Select Classroom")
        .open(&mut *show_add_classroom_form().write())
        .show(ui.ctx(), |ui| {
            // classes_ui(ui);
            Flex::horizontal()
                .align_items(egui_flex::FlexAlign::Stretch)
                .align_items_content(Align2::CENTER_CENTER)
                .gap(vec2(1., 1.0))
                .show(ui, |flex| {
                    for c in &*get_classrooms().read() {
                        flex.add_ui(item().grow(5.), |ui| {
                            // let b = Button::new(&c.1.name);
                            if ui
                                .add_sized(vec2(50., 30.), Button::new(&c.1.name))
                                .clicked()
                            {
                                add_more_classroom(c.1.id, id);
                            }
                        });
                    }
                });
        });
}
fn add_more_teachers_list(ui: &mut egui::Ui) {
    let id = *selected_act().read();
    egui::Window::new("Select Teacher")
        .open(&mut *show_add_teacher_form().write())
        .show(ui.ctx(), |ui| {
            filter_teacher_text(ui);
            Flex::vertical()
                // .justify(egui_flex::FlexJustify::SpaceAround)
                .wrap(true)
                .gap(vec2(1., 1.0))
                .show(ui, |flex| {
                    for t in &*filtered_teachers().read() {
                        flex.add_ui(item().grow(1.), |ui| {
                            // let b = Button::new(&c.1.name);
                            if ui
                                .add_sized(vec2(250., 30.), Button::new(&t.name))
                                .clicked()
                            {
                                add_more_teacher(t.id, id);
                            }
                        });
                    }
                });
        });
}
fn add_partner_form(ui: &mut egui::Ui) {
    let act_id = *selected_act().read();
    egui::Window::new("Ortak Ders Ekle")
        .open(&mut *show_add_partner_form().write())
        .show(ui.ctx(), |ui| {
            Flex::vertical()
                // .justify(egui_flex::FlexJustify::SpaceAround)
                // .wrap(false)
                .gap(vec2(1., 1.0))
                .show(ui, |flex| {
                    flex.add_ui(item(), |ui| {
                        if ui
                            .add(
                                TextEdit::singleline(&mut *filter_acts_string().write())
                                    .hint_text("Ders adı Öğretmen Sınıf sıralamasıyla filtrele"),
                            )
                            .changed()
                        {
                            filtering_acts();
                        };
                    });
                    for a in &*filtered_acts().read() {
                        if a.id != act_id
                            && a.partners.is_empty()
                            && partnered_act().read().get(&a.id).is_none()
                        {
                            flex.add_ui(item().grow(1.), |ui| {
                                // let b = Button::new(&c.1.name);
                                if ui
                                    .add_sized(vec2(250., 30.), Button::new(format!("{:?}", a)))
                                    .clicked()
                                {
                                    change_partner(act_id, a.id);
                                }
                            });
                        }
                    }
                });
        });
}

pub fn acts_frames(ui: &mut egui::Ui, acts: &Vec<Activity>) {
    let tt = data().read().timetables.clone();
    let frame = Frame::none()
        .stroke(Stroke::new(0.5, Color32::LIGHT_GRAY))
        .inner_margin(vec2(10., 10.))
        .rounding(5.);
    Flex::horizontal()
        .gap(vec2(10., 10.))
        .wrap(true)
        .show(ui, |flex| {
            for a in acts {
                if !tt.contains_key(&a.id) {
                    flex.add_ui(item().grow(1.).frame(frame), |ui| {
                        ui.dnd_drag_source(Id::new(a.id), a.clone(), |ui| {
                            ui.add(Label::new(format!("{:?}", a)));
                        });
                    });
                }
            }
        });
}
pub fn filtered_acts() -> &'static Arc<RwLock<Vec<Activity>>> {
    static TEACHERS: OnceLock<Arc<RwLock<Vec<Activity>>>> = OnceLock::new();
    TEACHERS.get_or_init(|| Arc::new(RwLock::new(vec![])))
}
pub fn filter_acts_string() -> &'static Arc<RwLock<String>> {
    static TEACHERS: OnceLock<Arc<RwLock<String>>> = OnceLock::new();
    TEACHERS.get_or_init(|| Arc::new(RwLock::new("".to_string())))
}

pub fn filtering_acts() {
    let flt = &*filter_acts_string().read().clone().to_uppercase();
    *filtered_acts().write() = activities()
        .read()
        .iter()
        .filter(|a| format!("{:?}", a.1).to_uppercase().contains(flt))
        .map(|a| a.1.clone())
        .collect();
}
fn change_no_limit(id: i32) {
    let acts = &mut *activities().write();
    let act = acts.get_mut(&id);
    if let Some(a) = act {
        a.no_limit = !a.no_limit;
        std::thread::spawn(move || {
            *classes_acts().write() = create_classes_acts();
            *teachers_acts().write() = create_teacher_acts();
            save_activities();
            // set_show_teacher_form();
        });
    }
}
fn change_partner(act_id: i32, p_id: i32) {
    let acts = &mut *activities().write();
    let act = acts.get_mut(&act_id);
    if let Some(a) = act {
        a.partners.push(p_id);
        std::thread::spawn(move || {
            *partnered_act().write() = create_partnered_act();
            *classes_acts().write() = create_classes_acts();
            *teachers_acts().write() = create_teacher_acts();
            save_activities();
        });
    }
}
fn add_more_teacher(teacher: i32, id: i32) {
    let acts = &mut *activities().write();
    let act = acts.get_mut(&id);
    if let Some(a) = act {
        if !a.teachers.iter().any(|i| i == &teacher) {
            a.teachers.push(teacher);
        }
        std::thread::spawn(move || {
            *classes_acts().write() = create_classes_acts();
            *teachers_acts().write() = create_teacher_acts();
            save_activities();
            set_show_teacher_form();
        });
    }
}
fn del_partner(id: i32, p_id: i32) {
    let acts = &mut *activities().write();
    let act = acts.get_mut(&id);
    if let Some(a) = act {
        a.partners.retain(|a| a != &p_id);
        std::thread::spawn(move || {
            *classes_acts().write() = create_classes_acts();
            *teachers_acts().write() = create_teacher_acts();
            *partnered_act().write() = create_partnered_act();
            save_activities();
        });
    }
}
fn remove_teacher(teacher: i32, id: i32) {
    let acts = &mut *activities().write();
    let act = acts.get_mut(&id);
    if let Some(a) = act {
        a.teachers.retain(|t| t != &teacher);
        std::thread::spawn(move || {
            *classes_acts().write() = create_classes_acts();
            *teachers_acts().write() = create_teacher_acts();
            save_activities();
        });
    }
}
fn add_more_class(class: i32, id: i32) {
    let acts = &mut *activities().write();
    let act = acts.get_mut(&id);
    if let Some(a) = act {
        if !a.classes.iter().any(|i| i == &class) {
            a.classes.push(class);
        }
        std::thread::spawn(move || {
            *classes_acts().write() = create_classes_acts();
            *teachers_acts().write() = create_teacher_acts();
            save_activities();
            // set_show_teacher_form();
        });
    }
}
fn remove_class(class: i32, id: i32) {
    let acts = &mut *activities().write();
    let act = acts.get_mut(&id);
    if let Some(a) = act {
        a.classes.retain(|c| c != &class);
        std::thread::spawn(move || {
            *classes_acts().write() = create_classes_acts();
            *teachers_acts().write() = create_teacher_acts();
            save_activities();
        });
    }
}
fn add_more_classroom(class: i32, id: i32) {
    let acts = &mut *activities().write();
    let act = acts.get_mut(&id);
    if let Some(a) = act {
        if !a.classroom.iter().any(|i| i == &class) {
            a.classroom.push(class);
        }
        std::thread::spawn(move || {
            // *classes_acts().write() = create_classes_acts();
            // *teachers_acts().write() = create_teacher_acts();
            save_activities();
            // set_show_teacher_form();
        });
    }
}
fn remove_classroom(cr: i32, id: i32) {
    let acts = &mut *activities().write();
    let act = acts.get_mut(&id);
    if let Some(a) = act {
        a.classroom.retain(|c| c != &cr);
        std::thread::spawn(move || {
            // *classes_acts().write() = create_classes_acts();
            // *teachers_acts().write() = create_teacher_acts();
            save_activities();
        });
    }
}

// fn addd(a: Activity, teacher: i32) {
//     // std::thread::spawn(move || {
//     if let Some(c_acts) = teachers_acts().write().get_mut(&teacher) {
//         c_acts.push(a.clone());
//     }
//     // });
// }