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

use eframe::egui::{self, mutex::RwLock, Align2, Color32, Frame, Label, Stroke, TextEdit, Vec2};
use egui_flex::{item, Flex};

use crate::tabs::classes::{class_name, get_classes, Class};

use super::{act_classes, filtered_classes};

fn filter_classes() -> &'static Arc<RwLock<String>> {
    static LECTURES: OnceLock<Arc<RwLock<String>>> = OnceLock::new();
    LECTURES.get_or_init(|| Arc::new(RwLock::new("".to_string())))
}
// fn filter_range() -> &'static Arc<RwLock<usize>> {
//     let lec_len = filtered_classes().read().len();
//     let range = if lec_len >= 10 { lec_len } else { 5 };
//     static RANGE: OnceLock<Arc<RwLock<usize>>> = OnceLock::new();
//     RANGE.get_or_init(|| Arc::new(RwLock::new(range)))
// }

pub fn set_classes_filter() {
    let f = class_name().read();
    let f = &*f.to_uppercase();
    let lecs = get_classes()
        .read()
        .clone()
        .into_iter()
        .filter(|l| l.1.name.to_uppercase().contains(&f));
    *filtered_classes().write() = lecs.map(|c| c.1.clone()).collect();
}
pub fn select_classes_ui(ui: &mut egui::Ui) {
    ui.vertical(|ui| {
        Frame::none()
            .stroke(Stroke::new(1., Color32::BLACK))
            .rounding(1.)
            .inner_margin(10.0)
            .outer_margin(10.0)
            .show(ui, |ui| {
                ui.label("Sınıfları Seçin");

                if ui
                    .add(
                        TextEdit::singleline(&mut *filter_classes().write())
                            .hint_text("Sınıfları Filtrele"),
                    )
                    .changed()
                {
                    set_classes_filter()
                };
                ui.add_space(5.);
                Flex::horizontal()
                    .wrap(true)
                    // .justify(egui_flex::FlexJustify::Center)
                    .align_items(egui_flex::FlexAlign::Center)
                    .show(ui, |flex| {
                        let classes = filtered_classes().read();
                        // for class in &classes[..*filter_range().read()] {
                        for class in &classes[..] {
                            let is_selected = act_classes().read().iter().any(|i| class.id == i.id);
                            let stroke = Stroke::new(
                                if is_selected { 1.0 } else { 0.5 },
                                if is_selected {
                                    Color32::BLUE
                                } else {
                                    Color32::GRAY
                                },
                            );

                            let _frame = egui::Frame::default()
                                .stroke(stroke)
                                .rounding(5.)
                                .inner_margin(5.);
                            flex.add_flex(
                                item(),
                                Flex::horizontal().align_items_content(Align2::CENTER_TOP),
                                // frame,
                                |flex| {
                                    // let sel_lec = act_lec();
                                    if flex
                                        .add_ui(item(), |ui| {
                                            ui.add_sized([30., 15.], Label::new(&class.name))
                                        })
                                        .inner
                                        .on_hover_cursor(egui::CursorIcon::PointingHand)
                                        .clicked()
                                    {
                                        select_class(class.clone(), is_selected);
                                    };
                                },
                            );
                        }
                        // if *filter_range().read() != filtered_classes().read().len() {
                        //     show_more(flex);
                        // }
                    });
            });
    });
}
// fn show_more(flex: &mut FlexInstance) {
//     let frame = egui::Frame::default()
//         .stroke(Stroke::new(0.5, Color32::GRAY))
//         .rounding(5.)
//         .inner_margin(5.);
//     flex.add_flex_frame(
//         item(),
//         Flex::horizontal().align_items_content(Align2::CENTER_TOP),
//         frame,
//         |flex| {
//             // let sel_lec = act_lec();
//             if flex
//                 .add_simple(item(), |ui| {
//                     ui.add_sized(Vec2::new(30., 15.), Label::new("...Tümünü Göster"))
//                 })
//                 .inner
//                 .on_hover_cursor(egui::CursorIcon::PointingHand)
//                 .clicked()
//             {
//                 let l = filtered_classes().read().len();
//                 // *filter_range().write() = l;
//             };
//         },
//     );
// }
fn select_class(class: Class, del: bool) {
    let clss = act_classes();
    // let selected_class = selected_teacher().read().unwrap();
    std::thread::spawn(move || {
        // let class = class.clone();
        let clss = Arc::clone(clss);
        if del {
            clss.write().retain(|c| &c.id != &class.id);
        } else {
            clss.write().push(class.clone());
        }
    });
}