// use std::sync::{Arc, OnceLock, RwLock};

use std::sync::{Arc, OnceLock};

use eframe::egui::{self, mutex::RwLock, Align2, Button, Vec2};
use egui_flex::item;

use crate::tabs::{
    classes::{classes_acts, create_classes_acts, get_classes, selected_class, Class},
    classrooms::{get_classrooms, ClassRoom},
    get_page,
    lectures::{get_lectures, Lecture},
    teachers::{create_teacher_acts, get_teachers, selected_teacher, teachers_acts, Teacher},
    SubPage,
};

use super::{
    activities, classes_acts_hours, create_classes_hours, create_teachers_hours, del_states,
    save_activities, teachers_acts_hours, Activity,
};

pub mod classes_ui;
pub mod classrooms_ui;
pub mod lectures_ui;
pub mod teachers_ui;

pub fn filtered_classes() -> &'static Arc<RwLock<Vec<Class>>> {
    static LECTURES: OnceLock<Arc<RwLock<Vec<Class>>>> = OnceLock::new();
    LECTURES.get_or_init(|| Arc::new(RwLock::new(filtering_classes())))
}
pub fn show_form() -> &'static Arc<RwLock<bool>> {
    static LECTURES: OnceLock<Arc<RwLock<bool>>> = OnceLock::new();
    LECTURES.get_or_init(|| Arc::new(RwLock::new(false)))
}
pub fn filtering_classes() -> Vec<Class> {
    let lecs = get_classes().read().clone();
    let mut lecs = lecs.values().map(|v| v.clone()).collect::<Vec<Class>>();
    lecs.sort_by(|a, b| a.name.cmp(&b.name));
    lecs
}
pub fn filtered_lectures() -> &'static Arc<RwLock<Vec<Lecture>>> {
    static LECTURES: OnceLock<Arc<RwLock<Vec<Lecture>>>> = OnceLock::new();
    LECTURES.get_or_init(|| Arc::new(RwLock::new(filtering_lectures())))
}
pub fn filtering_lectures() -> Vec<Lecture> {
    let lecs = get_lectures().read().clone();
    let mut lecs = lecs.values().map(|v| v.clone()).collect::<Vec<Lecture>>();
    lecs.sort_by(|a, b| a.name.to_uppercase().cmp(&b.name.to_uppercase()));
    lecs
}
pub fn filtered_teachers() -> &'static Arc<RwLock<Vec<Teacher>>> {
    static LECTURES: OnceLock<Arc<RwLock<Vec<Teacher>>>> = OnceLock::new();
    LECTURES.get_or_init(|| Arc::new(RwLock::new(filtering_teachers().clone())))
}
pub fn filtering_teachers() -> Vec<Teacher> {
    let teachers = get_teachers().read().clone();
    let mut teachers = teachers
        .values()
        .map(|v| v.clone())
        .collect::<Vec<Teacher>>();
    teachers.sort_by(|a, b| a.name.to_uppercase().cmp(&b.name.to_uppercase()));
    teachers
}
pub fn filtered_classrooms() -> &'static Arc<RwLock<Vec<ClassRoom>>> {
    static LECTURES: OnceLock<Arc<RwLock<Vec<ClassRoom>>>> = OnceLock::new();
    LECTURES.get_or_init(|| Arc::new(RwLock::new(filtering_classrooms().clone())))
}
pub fn filtering_classrooms() -> Vec<ClassRoom> {
    let classrooms = get_classrooms().read().clone();
    let mut classrooms = classrooms
        .values()
        .map(|v| v.clone())
        .collect::<Vec<ClassRoom>>();
    classrooms.sort_by(|a, b| a.name.to_uppercase().cmp(&b.name.to_uppercase()));
    classrooms
}
pub fn act_lec() -> &'static Arc<RwLock<Option<Lecture>>> {
    static ACT_LEC: OnceLock<Arc<RwLock<Option<Lecture>>>> = OnceLock::new();
    ACT_LEC.get_or_init(|| Arc::new(RwLock::new(None)))
}
pub fn act_classes() -> &'static Arc<RwLock<Vec<Class>>> {
    static ACT_CLASSES: OnceLock<Arc<RwLock<Vec<Class>>>> = OnceLock::new();
    ACT_CLASSES.get_or_init(|| Arc::new(RwLock::new(vec![])))
}
pub fn act_hours() -> &'static Arc<RwLock<String>> {
    static ACT_HOURS: OnceLock<Arc<RwLock<String>>> = OnceLock::new();
    ACT_HOURS.get_or_init(|| Arc::new(RwLock::new("".to_string())))
}
pub fn act_teachers() -> &'static Arc<RwLock<Vec<Teacher>>> {
    static ACT_TEACHER: OnceLock<Arc<RwLock<Vec<Teacher>>>> = OnceLock::new();
    ACT_TEACHER.get_or_init(|| Arc::new(RwLock::new(vec![])))
}
pub fn act_classrooms() -> &'static Arc<RwLock<Vec<ClassRoom>>> {
    static ACT_TEACHER: OnceLock<Arc<RwLock<Vec<ClassRoom>>>> = OnceLock::new();
    ACT_TEACHER.get_or_init(|| Arc::new(RwLock::new(vec![])))
}
pub fn add_act() {
    let lec = &*act_lec().read();
    if let Some(lec) = lec {
        let hours = act_hours().read().clone();
        let tchr = if let SubPage::Teachers = *get_page().read() {
            if let Some(t) = *selected_teacher().read() {
                vec![t]
            } else {
                vec![]
            }
        } else {
            vec![]
        };
        let cls = if let SubPage::Classes = *get_page().read() {
            if let Some(c) = *selected_class().read() {
                vec![c]
            } else {
                vec![]
            }
        } else {
            vec![]
        };
        hours.split(" ").for_each(|h| {
            let Ok(h) = h.parse::<usize>() else {
                return ();
            };
            let lec = lec.clone();
            let act = Activity {
                id: find_new_act_id(),
                lecture: lec.id,
                classes: cls.clone(),
                teachers: tchr.clone(),
                hour: h,
                classroom: vec![],
                no_limit: false,
                partners: vec![],
            };
            add_activity(act);
            // update_activity_data();
        });
    }
}

pub fn add_activity(act: Activity) {
    std::thread::spawn(move || {
        let acts = activities();
        acts.write().insert(act.id, act.clone());
        update_activity_data();
        save_activities();
    })
    .join()
    .unwrap();
}

pub fn update_activity_data() {
    std::thread::spawn(move || {
        *teachers_acts().write() = create_teacher_acts();
        *classes_acts().write() = create_classes_acts();
        *teachers_acts_hours().write() = create_teachers_hours();
        *classes_acts_hours().write() = create_classes_hours();
        let len = activities().read().len();
        *del_states().write() = vec![false; len];
    });
}

pub fn find_new_act_id() -> i32 {
    let len = activities().read().len() as i32;
    for i in 1..len + 1 {
        if !activities().read().contains_key(&i) {
            return i;
        }
    }
    len + 1
}
pub fn act_form(ui: &mut egui::Ui) {
    egui::Window::new("My Window")
        .open(&mut *show_form().write())
        // .default_size(vec2(500., 500.))
        .show(ui.ctx(), |ui| {
            ui.vertical_centered(|ui| {
                egui_flex::Flex::horizontal()
                    // .gap(Vec2::new(5., 5.))
                    .grow_items(1.0)
                    .align_content(egui_flex::FlexAlignContent::SpaceBetween)
                    .align_items_content(Align2::CENTER_TOP)
                    // .wrap(true)
                    .gap(Vec2::new(1., 1.))
                    .show(ui, |flex| {
                        flex.add_ui(item().basis(500.), |ui| {
                            lectures_ui::select_lecture_ui(ui);
                        });
                        flex.add_ui(item().basis(500.), |ui| {
                            classes_ui::select_classes_ui(ui);
                        });
                        flex.add_ui(item().basis(500.), |_ui| {
                            // teachers_ui::select_teachers_ui(ui);
                        });
                    });
                if ui
                    .add_sized(Vec2::new(500., 30.), Button::new("Dosyaya Kaydet"))
                    .clicked()
                {
                    save_activities();
                };
            });
        });
}