use eframe::egui;
use rust_i18n::t;
use crate::installer::{GlobalState, InstallerStep};

/// Klavye düzeni ve varyantı seçimi.
/// Gerçek uygulamada mevcut düzenler `localectl list-keymaps`
/// veya `/usr/share/X11/xkb/rules/evdev.lst` dosyasından okunabilir.
pub struct KeyboardStep {
    test_input: String,
    layouts: Vec<(&'static str, &'static str)>,   // (kod, gösterim adı)
}

impl Default for KeyboardStep {
    fn default() -> Self {
        Self {
            test_input: String::new(),
            layouts: vec![
                ("tr",   "Türkçe (Q)"),
                ("tr:f", "Türkçe (F)"),
                ("us",   "İngilizce (US)"),
                ("de",   "Almanca"),
                ("fr",   "Fransızca"),
                ("es",   "İspanyolca"),
                ("ru",   "Rusça"),
                ("ar",   "Arapça"),
            ],
        }
    }
}

impl InstallerStep for KeyboardStep {
    fn name(&self) -> String {
        t!("keyboard").to_string()
    }

    fn on_enter(&mut self, state: &mut GlobalState) {
        // Varsayılan düzen sistemi diline göre seçilir
        if state.keyboard_layout.is_empty() {
            state.keyboard_layout = if state.language == "tr" {
                "tr".to_string()
            } else {
                "us".to_string()
            };
        }
    }

    fn show(&mut self, ui: &mut egui::Ui, state: &mut GlobalState) {
        ui.heading(t!("keyboard_title"));
        ui.label(t!("keyboard_description"));

        ui.add_space(12.0);

        ui.columns(2, |cols| {
            // Sol: Düzen listesi
            cols[0].label(t!("keyboard_layout_label"));
            egui::ScrollArea::vertical()
                .id_source("kbd_layouts")
                .max_height(260.0)
                .show(&mut cols[0], |ui| {
                    // &(code, display) pattern ile code: &str, display: &str olur
                    for &(code, display) in &self.layouts {
                        // tr:f kodunu layout+variant olarak ayır
                        let (layout, variant) = if let Some(pos) = code.find(':') {
                            (&code[..pos], &code[pos + 1..])
                        } else {
                            (code, "")
                        };

                        let is_selected = state.keyboard_layout == layout
                            && state.keyboard_variant == variant;

                        if ui.selectable_label(is_selected, display).clicked() {
                            state.keyboard_layout = layout.to_string();
                            state.keyboard_variant = variant.to_string();
                        }
                    }
                });

            // Sağ: Test alanı
            cols[1].label(t!("keyboard_test_label"));
            cols[1].add_space(4.0);
            cols[1].add(
                egui::TextEdit::multiline(&mut self.test_input)
                    .desired_rows(5)
                    .hint_text(t!("keyboard_test_hint")),
            );

            cols[1].add_space(8.0);
            cols[1].label(format!("{}: {}", t!("keyboard_selected"), {
                let variant_part = if state.keyboard_variant.is_empty() {
                    String::new()
                } else {
                    format!(" ({})", state.keyboard_variant)
                };
                format!("{}{}", state.keyboard_layout, variant_part)
            }));
        });
    }

    fn is_complete(&self, state: &GlobalState) -> bool {
        !state.keyboard_layout.is_empty()
    }
}
