//! This example showcases setting up a basic application and window, setting up some views to
//! work with autolayout, and some basic ways to handle colors.

use cacao::appkit::menu::{Menu, MenuItem};
use cacao::appkit::toolbar::Toolbar;
use cacao::appkit::window::{Window, WindowConfig, WindowDelegate, WindowToolbarStyle};
use cacao::appkit::{App, AppDelegate};

use cacao::webview::{WebView, WebViewConfig, WebViewDelegate};

struct BasicApp {
    window: Window<AppWindow>
}

impl AppDelegate for BasicApp {
    fn did_finish_launching(&self) {
        App::activate();
        self.window.show();
    }
}

#[derive(Default)]
pub struct WebViewInstance;

impl WebViewDelegate for WebViewInstance {
    fn on_custom_protocol_request(&self, path: &str) -> Option<Vec<u8>> {
        let requested_asset_path = path.replace("cacao://", "");

        let index_html = r#"
        <!DOCTYPE html>
        <html lang="en">
            <head>
            <meta charset="UTF-8" />
            <meta http-equiv="X-UA-Compatible" content="IE=edge" />
            <meta name="viewport" content="width=device-width, initial-scale=1.0" />
            </head>
            <body>
            <h1>Welcome 🍫</h1>
            <a href="/hello.html">Link</a>
            </body>
        </html>"#;

        let link_html = r#"
        <!DOCTYPE html>
        <html lang="en">
            <head>
            <meta charset="UTF-8" />
            <meta http-equiv="X-UA-Compatible" content="IE=edge" />
            <meta name="viewport" content="width=device-width, initial-scale=1.0" />
            </head>
            <body>
            <h1>Hello!</h1>
            <a href="/index.html">Back home</a>
            </body>
        </html>"#;

        return match requested_asset_path.as_str() {
            "/hello.html" => Some(link_html.as_bytes().into()),
            _ => Some(index_html.as_bytes().into())
        };
    }
}

struct AppWindow {
    content: WebView<WebViewInstance>
}

impl AppWindow {
    pub fn new() -> Self {
        let mut webview_config = WebViewConfig::default();

        // register the protocol in the webview
        webview_config.add_custom_protocol("cacao");

        AppWindow {
            content: WebView::with(webview_config, WebViewInstance::default())
        }
    }

    pub fn load_url(&self, url: &str) {
        self.content.load_url(url);
    }
}

impl WindowDelegate for AppWindow {
    const NAME: &'static str = "WindowDelegate";

    fn did_load(&mut self, window: Window) {
        window.set_title("Browser Example");
        window.set_autosave_name("CacaoBrowserExample");
        window.set_minimum_content_size(400., 400.);

        window.set_content_view(&self.content);

        // load custom protocol
        self.load_url("cacao://");
    }
}

fn main() {
    App::new("com.test.window", BasicApp {
        window: Window::with(WindowConfig::default(), AppWindow::new())
    })
    .run();
}