use criterion::criterion_group;
use criterion::criterion_main;
use criterion::Criterion;
use std::collections::HashMap;
use std::fs;
use std::io;

use fluent_syntax::parser::parse_runtime;

fn read_file(path: &str) -> Result<String, io::Error> {
    fs::read_to_string(path)
}

#[cfg(feature = "all-benchmarks")]
fn get_resources(tests: &[&'static str]) -> HashMap<&'static str, String> {
    let mut ftl_strings = HashMap::new();
    for test in tests {
        let path = format!("./benches/{}", test);
        ftl_strings.insert(*test, read_file(&path).expect("Couldn't load file"));
    }
    return ftl_strings;
}

fn get_ctxs(tests: &[&'static str]) -> HashMap<&'static str, Vec<String>> {
    let mut ftl_strings = HashMap::new();
    for test in tests {
        let paths = fs::read_dir(format!("./benches/contexts/{}", test)).unwrap();
        let strings = paths
            .into_iter()
            .map(|p| {
                let p = p.unwrap().path();
                let path = p.to_str().unwrap();
                read_file(path).unwrap()
            })
            .collect::<Vec<_>>();
        ftl_strings.insert(*test, strings);
    }
    ftl_strings
}

fn parse_bench(c: &mut Criterion) {
    #[cfg(feature = "all-benchmarks")]
    {
        let tests = &["simple.ftl", "preferences.ftl", "menubar.ftl"];

        let mut group = c.benchmark_group("parse_resource");

        for (name, resource) in get_resources(tests) {
            group.bench_with_input(name, &resource, |b, source| {
                b.iter(|| parse_runtime(source.as_str()).expect("Parsing of the FTL failed."))
            });
        }

        group.finish();
    }

    let ctx_names = &["browser", "preferences"];

    #[cfg(feature = "all-benchmarks")]
    {
        use fluent_syntax::parser::parse;

        let mut group = c.benchmark_group("parse_ctx");

        for (name, ctx) in get_ctxs(ctx_names) {
            group.bench_with_input(name, &ctx, |b, ctx| {
                b.iter(|| {
                    for source in ctx {
                        parse(source.as_str()).expect("Parsing of the FTL failed.");
                    }
                })
            });
        }

        group.finish();
    }

    {
        let mut group = c.benchmark_group("parse_ctx_runtime");

        for (name, ctx) in get_ctxs(ctx_names) {
            group.bench_with_input(name, &ctx, |b, ctx| {
                b.iter(|| {
                    for source in ctx {
                        parse_runtime(source.as_str()).expect("Parsing of the FTL failed.");
                    }
                })
            });
        }

        group.finish();
    }

    #[cfg(feature = "all-benchmarks")]
    {
        use fluent_syntax::unicode::{unescape_unicode, unescape_unicode_to_string};

        let strings = &[
            "foo",
            "This is an example value",
            "Hello \\u00e3\\u00e9 World",
            "\\u004c\\u006f\\u0072\\u0065\\u006d \\u0069\\u0070\\u0073\\u0075\\u006d \\u0064\\u006f\\u006c\\u006f\\u0072 \\u0073\\u0069\\u0074 \\u0061\\u006d\\u0065\\u0074",
            "Let me introduce \\\"The\\\" Fluent",
            "And here's an example of \\\\ a character to be escaped",
            "But this message is completely unescape free",
            "And so is this one",
            "Maybe this one is as well completely escape free",
            "Welcome to Mozilla Firefox",
            "\\u0054\\u0068\\u0065\\u0073\\u0065 \\u0073\\u0065\\u0074\\u0074\\u0069\\u006e\\u0067\\u0073 \\u0061\\u0072\\u0065 \\u0074\\u0061\\u0069\\u006c\\u006f\\u0072\\u0065\\u0064 \\u0074\\u006f \\u0079\\u006f\\u0075\\u0072 \\u0063\\u006f\\u006d\\u0070\\u0075\\u0074\\u0065\\u0072\\u2019\\u0073 \\u0068\\u0061\\u0072\\u0064\\u0077\\u0061\\u0072\\u0065 \\u0061\\u006e\\u0064 \\u006f\\u0070\\u0065\\u0072\\u0061\\u0074\\u0069\\u006e\\u0067 \\u0073\\u0079\\u0073\\u0074\\u0065\\u006d\\u002e",
            "These settings are tailored to your computer’s hardware and operating system",
            "Use recommended performance settings",
            "\\u0041\\u0064\\u0064\\u0069\\u0074\\u0069\\u006f\\u006e\\u0061\\u006c \\u0063\\u006f\\u006e\\u0074\\u0065\\u006e\\u0074 \\u0070\\u0072\\u006f\\u0063\\u0065\\u0073\\u0073\\u0065\\u0073 \\u0063\\u0061\\u006e \\u0069\\u006d\\u0070\\u0072\\u006f\\u0076\\u0065 \\u0070\\u0065\\u0072\\u0066\\u006f\\u0072\\u006d\\u0061\\u006e\\u0063\\u0065 \\u0077\\u0068\\u0065\\u006e \\u0075\\u0073\\u0069\\u006e\\u0067 \\u006d\\u0075\\u006c\\u0074\\u0069\\u0070\\u006c\\u0065 \\u0074\\u0061\\u0062\\u0073\\u002c \\u0062\\u0075\\u0074 \\u0077\\u0069\\u006c\\u006c \\u0061\\u006c\\u0073\\u006f \\u0075\\u0073\\u0065 \\u006d\\u006f\\u0072\\u0065 \\u006d\\u0065\\u006d\\u006f\\u0072\\u0079\\u002e",
            "Additional content processes can improve performance when using multiple tabs, but will also use more memory.",
        ];

        let mut group = c.benchmark_group("unicode");

        group.bench_function("writer", |b| {
            b.iter(|| {
                let mut result = String::new();
                for s in strings {
                    unescape_unicode(&mut result, s).unwrap();
                    result.clear();
                }
            })
        });

        group.bench_function("to_string", |b| {
            b.iter(|| {
                for s in strings {
                    let _ = unescape_unicode_to_string(s);
                }
            })
        });

        group.finish();
    }
}

criterion_group!(benches, parse_bench,);
criterion_main!(benches);
