use eframe::egui::{self, Rect, Vec2};
use super::combobox_stil::draw_gradient_bg;

/// Stil uygulanmış ComboBox oluşturur (genişlik ayarı yapılmaz, Grid içinde kullanım için).
pub fn combo_box(
    id_source: impl std::hash::Hash,
    selected_text: impl Into<egui::WidgetText>,
) -> egui::ComboBox {
    egui::ComboBox::from_id_source(id_source).selected_text(selected_text)
}

/// Stil uygulanmış ComboBox oluşturur ve genişlik verir.
pub fn combo_box_with_width(
    id_source: impl std::hash::Hash,
    selected_text: impl Into<egui::WidgetText>,
    width: f32,
) -> egui::ComboBox {
    combo_box(id_source, selected_text).width(width)
}

/// ComboBox dropdown'ını açar, genişlik kısıtlaması uygular ve içeriği çizer.
pub fn show_combo_box<R>(
    ui: &mut egui::Ui,
    id_source: impl std::hash::Hash,
    selected_text: impl Into<egui::WidgetText>,
    width: f32,
    add_contents: impl FnOnce(&mut egui::Ui, f32) -> R,
) -> Option<R> {
    combo_box_with_width(id_source, selected_text, width)
        .show_ui(ui, |ui| {
            ui.set_min_width(width);
            ui.set_max_width(width);
            add_contents(ui, width)
        })
        .inner
}

/// ComboBox dropdown öğesi — gradient arkaplan, tam genişlik tıklanabilir, pointing hand imleci.
pub fn selectable_value<T: PartialEq>(
    ui: &mut egui::Ui,
    current: &mut T,
    value: T,
    label: &str,
    width: f32,
) -> egui::Response {
    let item_height = 28.0;
    let (rect, response) = ui.allocate_exact_size(Vec2::new(width, item_height), egui::Sense::click());

    draw_gradient_bg(ui, rect);

    let text_color = combobox_stil_text_color(ui);
    let painter = ui.painter();
    painter.text(
        egui::pos2(rect.left() + 6.0, rect.center().y),
        egui::Align2::LEFT_CENTER,
        label,
        egui::FontId::proportional(14.0),
        text_color,
    );

    if response.clicked() {
        *current = value;
    }
    response.on_hover_cursor(egui::CursorIcon::PointingHand)
}

fn combobox_stil_text_color(ui: &egui::Ui) -> egui::Color32 {
    let bg = ui.visuals().panel_fill;
    if bg.r() < 128 && bg.g() < 128 && bg.b() < 128 {
        egui::Color32::from_rgb(230, 230, 240)
    } else {
        egui::Color32::from_rgb(50, 50, 50)
    }
}

/// ComboBox dropdown öğesi — özel içerik çizmek için (ör. bayrak + metin).
/// `add_contents` callback'i verilen `Rect` içine içerik ekler.
pub fn selectable_value_custom<R>(
    ui: &mut egui::Ui,
    width: f32,
    add_contents: impl FnOnce(&mut egui::Ui, Rect) -> R,
) -> egui::Response {
    let item_height = 28.0;
    let (rect, mut response) = ui.allocate_exact_size(Vec2::new(width, item_height), egui::Sense::click());

    draw_gradient_bg(ui, rect);

    add_contents(ui, rect);

    if response.clicked() {
        response.mark_changed();
    }
    response.on_hover_cursor(egui::CursorIcon::PointingHand)
}


