use gtk::gio::Cancellable;
use gtk::prelude::*;
use gtk::{Application, ApplicationWindow, Picture, Scale, Label, FileDialog};
use image::{DynamicImage, ImageBuffer, RgbImage};
use gtk::{Button, Box as GtkBox, Orientation};
use gtk::glib::Propagation;
use gtk::gdk_pixbuf::Pixbuf;
use std::fs;
use std::path::Path;
use gtk::gio::File;
use std::rc::Rc;
use std::cell::RefCell;

fn main() {
    // Инициализация приложения
    let app = Application::builder()
        .application_id("ru.risdeveau.imageeditor")
        .build();

    // Запуск приложения
    app.connect_activate(|app| {
        build_ui(app);
    });

    app.run();
}

fn build_ui(app: &Application) {
    // Создание окна
    let window = ApplicationWindow::builder()
        .application(app)
        .title("Image Editor")
        .default_width(800)
        .default_height(600)
        .build();
    window.set_resizable(false);

    let selected_file = Rc::new(RefCell::new(None::<File>));

    // Создание кнопки для открытия диалога выбора файла
    let button = Button::with_label("Select Image");
    let picture = Picture::new();
    picture.set_size_request(400, 400);

    {
        let window = window.clone();
        let selected_file = selected_file.clone();
        let picture = picture.clone();
        button.connect_clicked(move |_| {
            // Создание FileDialog
            let dialog = FileDialog::builder()
                .title("Select an Image")
                .accept_label("Open")
                .build();

            // Фильтр для изображений
            let filter = gtk::FileFilter::new();
            filter.add_mime_type("image/png"); // Разрешить только изображения
            filter.set_name(Some("Image Files"));
            dialog.set_default_filter(Some(&filter));

            // Показ диалога и обработка результата
            let window = window.clone();
            let selected_file = selected_file.clone();
            let picture = picture.clone();
            dialog.open(Some(&window), None::<&gtk::gio::Cancellable>, move |result| {
                if let Ok(file) = result {
                    // Получение выбранного файла
                    let path = file.path().unwrap();
                    println!("Selected image: {:?}", path);

                    // Загрузка изображения (опционально)
                    if let Ok(pixbuf) = Pixbuf::from_file(&path) {
                        println!("Image loaded successfully: {}x{}", pixbuf.width(), pixbuf.height());
                        let _ = fs::copy(&path, "/tmp/modified.png");
                        *selected_file.borrow_mut() = Some(file.clone());
                        picture.set_pixbuf(Some(&pixbuf));

                    } else {
                        eprintln!("Failed to load image.");
                    }
                } else {
                    eprintln!("File selection canceled.");
                }
            });
        });
    }

    if selected_file.borrow().is_some() {
        button.set_visible(false);
    }

    let br_slider = Scale::with_range(Orientation::Horizontal, -128., 128., 1.);
    br_slider.set_value(0.);
    br_slider.set_hexpand(true);

    let br_text = Label::new(Some("Brightness: 0.00"));

    let br_container = GtkBox::new(Orientation::Horizontal, 5);
    br_container.append(&br_text);
    br_container.append(&br_slider);

    {
        br_slider.clone().connect_change_value(move |_, _, _| {
            let value = br_slider.value();
            br_text.set_text(&format!("Brightness: {:.2}", value));

            // Продолжаем обработку события
            Propagation::Proceed
        });
    }
    
    
    let container = GtkBox::new(Orientation::Vertical, 8);
    container.append(&button);
    container.append(&picture);
    container.append(&br_container);
    
    window.set_child(Some(&container));
    
    // // Загрузка изображения
    // let mut img: RgbImage = ImageBuffer::new(256, 256); // Пример: пустое изображение
    // let mut dynamic_img = DynamicImage::ImageRgb8(img.clone());

    // // Сохранение изображения во временный файл
    // let temp_path = "temp_image.png";
    // dynamic_img.save(temp_path).unwrap();

    // // Создание виджета Picture для отображения изображения
    // let picture = Picture::for_filename(temp_path);

    // // Создание кнопки
    // let button = Button::with_label("Edit Image");

    // // Контейнер для размещения виджетов
    // let container = GtkBox::new(Orientation::Vertical, 5);
    // container.append(&picture);
    // container.append(&button);

    // // Обработка нажатия кнопки
    // button.connect_clicked(move |_| {
    //     // Редактирование изображения
    //     edit_image(&mut img);
    //     dynamic_img = DynamicImage::ImageRgb8(img.clone());

    //     // Обновление изображения в интерфейсе
    //     update_image(&picture, &dynamic_img);
    // });

    // // Добавление контейнера в окно
    // window.set_child(Some(&container));

    // Отображение окна
    window.show();
}

// fn edit_image(img: &mut RgbImage) {
//     for (x, y, pixel) in img.enumerate_pixels_mut() {
//         // Пример: инвертируем цвета
//         pixel[0] = 255 - pixel[0]; // Красный
//         pixel[1] = 255 - pixel[1]; // Зеленый
//         pixel[2] = 255 - pixel[2]; // Синий
//     }
// }

// fn update_image(picture: &Picture, img: &DynamicImage) {
//     img.save("tmp.png").unwrap();
//     picture.set_filename(Some(temp_path));
// }
