use eframe::egui;
use std::{
    fmt,
    fs::File,
    io::{Read, Write},
    sync::{Arc, OnceLock},
};

use eframe::egui::{mutex::RwLock, Align2, Button, Color32, TextEdit, Vec2};
use egui_flex::{item, Flex, FlexInstance};
use serde::{Deserialize, Serialize};
pub mod activities;
pub mod classes;
pub mod classrooms;
pub mod generate;
pub mod generating;
pub mod lectures;
pub mod limitations;
pub mod print_pdf;
pub mod teachers;

#[derive(Default, Debug, Eq, PartialEq, Clone)]
pub enum SubPage {
    Teachers,
    #[default]
    Classes,
}
impl fmt::Display for SubPage {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            SubPage::Teachers => write!(f, "Öğretmenler"),
            SubPage::Classes => write!(f, "Sınıflar"),
            // SubPage::Classrooms => write!(f, "Derslikler"),
        }
    }
}
pub fn get_page() -> &'static Arc<RwLock<SubPage>> {
    static PAGE: OnceLock<Arc<RwLock<SubPage>>> = OnceLock::new();
    PAGE.get_or_init(|| Arc::new(RwLock::new(SubPage::Classes)))
}
#[derive(Default, Debug, Serialize, Deserialize)]
pub struct School {
    name: String,
    hour: usize,
}

// impl School {
//     fn get_name(self) -> String {
//         self.name
//     }
//     fn get_hour(&self) -> i32 {
//         self.hour
//     }
// }
pub fn school_page(ui: &mut eframe::egui::Ui) {
    ui.vertical_centered(|ui| {
        let name = &mut *school_name().write();
        let name_text = TextEdit::singleline(name).hint_text("Okulunuzun Adı");
        ui.add(name_text);
        let hour = &mut *school_hour().write();
        let hour_text = TextEdit::singleline(hour).hint_text("Günlük Ders Saati Sayısı");
        ui.add(hour_text);
        let button = Button::new("Kaydet");
        if ui
            .add_enabled(hour.parse::<usize>().is_ok(), button)
            .clicked()
        {
            save_school();
        };
    });
}

fn save_school() {
    std::thread::spawn(|| {
        let school = School {
            name: school_name().read().clone(),
            hour: school_hour().read().parse::<usize>().unwrap(),
        };
        let js = serde_json::to_string(&school);
        match js {
            Ok(j) => {
                let mut f = File::create("./db/school.json").unwrap();
                f.write_all(j.as_bytes()).unwrap();
            }
            Err(_) => {}
        }
    });
}
fn read_school() -> School {
    let f = File::open("./db/school.json");
    if let Ok(mut f) = f {
        let mut content: String = String::new();
        f.read_to_string(&mut content).unwrap();
        let cls: School = serde_json::from_str(content.as_str()).unwrap();
        return cls;
    }
    School::default()
}
fn get_school() -> &'static Arc<RwLock<School>> {
    static SCHOOL: OnceLock<Arc<RwLock<School>>> = OnceLock::new();
    SCHOOL.get_or_init(|| Arc::new(RwLock::new(read_school())))
}
fn school_name() -> &'static Arc<RwLock<String>> {
    let name = &*get_school().read().name;
    static SCHOOL: OnceLock<Arc<RwLock<String>>> = OnceLock::new();
    SCHOOL.get_or_init(|| Arc::new(RwLock::new(name.to_string())))
}
pub fn school_hour() -> &'static Arc<RwLock<String>> {
    let hour = get_school().read().hour;
    static SCHOOL: OnceLock<Arc<RwLock<String>>> = OnceLock::new();
    SCHOOL.get_or_init(|| Arc::new(RwLock::new(hour.to_string())))
}
pub fn panel_buttons(ui: &mut egui::Ui) {
    ui.layout().horizontal_justify();
    let panels = vec![SubPage::Classes, SubPage::Teachers];
    Flex::horizontal()
        .wrap(true)
        .justify(egui_flex::FlexJustify::Center)
        .width_percent(1.)
        .align_items_content(Align2::CENTER_TOP)
        .show(ui, |flex| panels.iter().for_each(|p| panel_frame(flex, p)));
}

fn panel_frame(flex: &mut FlexInstance, p: &SubPage) {
    let page = &*get_page().read();
    let f_color = if page == p {
        Color32::DARK_BLUE
    } else {
        Color32::default()
    };
    let resp = flex.add(
        item().grow(1.),
        Button::new(format!("{p}"))
            .min_size(Vec2::new(150., 40.))
            .fill(f_color),
    );
    if resp.clicked() {
        let p = p.clone();
        std::thread::spawn(move || {
            *get_page().write() = p.clone();
        });
    }
}