#include "catch/catch.hpp"
#include "inja/inja.hpp"


using json = nlohmann::json;


TEST_CASE("dot-to-pointer") {
    std::string buffer;
    CHECK( inja::convert_dot_to_json_pointer("test", buffer) == "/test" );
    CHECK( inja::convert_dot_to_json_pointer("guests.2", buffer) == "/guests/2" );
    CHECK( inja::convert_dot_to_json_pointer("person.names.surname", buffer) == "/person/names/surname" );
}

TEST_CASE("types") {
    inja::Environment env;
    json data;
    data["name"] = "Peter";
    data["city"] = "Brunswick";
    data["age"] = 29;
    data["names"] = {"Jeff", "Seb"};
    data["brother"]["name"] = "Chris";
    data["brother"]["daughters"] = {"Maria", "Helen"};
    data["brother"]["daughter0"] = { { "name", "Maria" } };
    data["is_happy"] = true;
    data["is_sad"] = false;
    data["relatives"]["mother"] = "Maria";
    data["relatives"]["brother"] = "Chris";
    data["relatives"]["sister"] = "Jenny";
    data["vars"] = {2, 3, 4, 0, -1, -2, -3};


    SECTION("basic") {
        CHECK( env.render("", data) == "" );
        CHECK( env.render("Hello World!", data) == "Hello World!" );
    }

    SECTION("variables") {
        CHECK( env.render("Hello {{ name }}!", data) == "Hello Peter!" );
        CHECK( env.render("{{ name }}", data) == "Peter" );
        CHECK( env.render("{{name}}", data) == "Peter" );
        CHECK( env.render("{{ name }} is {{ age }} years old.", data) == "Peter is 29 years old." );
        CHECK( env.render("Hello {{ name }}! I come from {{ city }}.", data) == "Hello Peter! I come from Brunswick." );
        CHECK( env.render("Hello {{ names.1 }}!", data) == "Hello Seb!" );
        CHECK( env.render("Hello {{ brother.name }}!", data) == "Hello Chris!" );
        CHECK( env.render("Hello {{ brother.daughter0.name }}!", data) == "Hello Maria!" );
        CHECK( env.render("{{ \"{{ no_value }}\" }}", data) == "{{ no_value }}" );

        CHECK_THROWS_WITH( env.render("{{unknown}}", data), "[inja.exception.render_error] variable 'unknown' not found" );
    }

    SECTION("comments") {
        CHECK( env.render("Hello{# This is a comment #}!", data) == "Hello!" );
        CHECK( env.render("{# --- #Todo --- #}", data) == "" );
    }

    SECTION("loops") {
        CHECK( env.render("{% for name in names %}a{% endfor %}", data) == "aa" );
        CHECK( env.render("Hello {% for name in names %}{{ name }} {% endfor %}!", data) == "Hello Jeff Seb !" );
        CHECK( env.render("Hello {% for name in names %}{{ loop.index }}: {{ name }}, {% endfor %}!", data) == "Hello 0: Jeff, 1: Seb, !" );
        CHECK( env.render("{% for type, name in relatives %}{{ type }}: {{ name }}, {% endfor %}", data) == "brother: Chris, mother: Maria, sister: Jenny, " );
        CHECK( env.render("{% for v in vars %}{% if v > 0 %}+{% endif %}{% endfor %}", data) == "+++" );
        CHECK( env.render("{% for name in names %}{{ loop.index }}: {{ name }}{% if not loop.is_last %}, {% endif %}{% endfor %}!", data) == "0: Jeff, 1: Seb!" );
        CHECK( env.render("{% for name in names %}{{ loop.index }}: {{ name }}{% if loop.is_last == false %}, {% endif %}{% endfor %}!", data) == "0: Jeff, 1: Seb!" );

        CHECK( env.render("{% for name in {} %}a{% endfor %}", data) == "" );

        CHECK_THROWS_WITH( env.render("{% for name ins names %}a{% endfor %}", data), "[inja.exception.parser_error] expected 'in', got 'ins'" );
        CHECK_THROWS_WITH( env.render("{% for name in empty_loop %}a{% endfor %}", data), "[inja.exception.render_error] variable 'empty_loop' not found" );
        // CHECK_THROWS_WITH( env.render("{% for name in relatives %}{{ name }}{% endfor %}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be array, but is object" );
    }

    SECTION("nested loops") {
        auto ldata = json::parse(
R"DELIM(
{ "outer" : [
    { "inner" : [
        { "in2" : [ 1, 2 ] },
        { "in2" : []},
        { "in2" : []}
        ]
    },
    { "inner" : [] },
    { "inner" : [
        { "in2" : [ 3, 4 ] },
        { "in2" : [ 5, 6 ] }
        ]
    }
    ]
}
)DELIM"
                );
        CHECK(env.render(R"DELIM(
{% for o in outer %}{% for i in o.inner %}{{loop.parent.index}}:{{loop.index}}::{{loop.parent.is_last}}
{% for ii in i.in2%}{{ii}},{%endfor%}
{%endfor%}{%endfor%}
)DELIM",
                    ldata) == "\n0:0::false\n1,2,\n0:1::false\n\n0:2::false\n\n2:0::true\n3,4,\n2:1::true\n5,6,\n\n");
    }

    SECTION("conditionals") {
        CHECK( env.render("{% if is_happy %}Yeah!{% endif %}", data) == "Yeah!" );
        CHECK( env.render("{% if is_sad %}Yeah!{% endif %}", data) == "" );
        CHECK( env.render("{% if is_sad %}Yeah!{% else %}Nooo...{% endif %}", data) == "Nooo..." );
        CHECK( env.render("{% if age == 29 %}Right{% else %}Wrong{% endif %}", data) == "Right" );
        CHECK( env.render("{% if age > 29 %}Right{% else %}Wrong{% endif %}", data) == "Wrong" );
        CHECK( env.render("{% if age <= 29 %}Right{% else %}Wrong{% endif %}", data) == "Right" );
        CHECK( env.render("{% if age != 28 %}Right{% else %}Wrong{% endif %}", data) == "Right" );
        CHECK( env.render("{% if age >= 30 %}Right{% else %}Wrong{% endif %}", data) == "Wrong" );
        CHECK( env.render("{% if age in [28, 29, 30] %}True{% endif %}", data) == "True" );
        CHECK( env.render("{% if age == 28 %}28{% else if age == 29 %}29{% endif %}", data) == "29" );
        CHECK( env.render("{% if age == 26 %}26{% else if age == 27 %}27{% else if age == 28 %}28{% else %}29{% endif %}", data) == "29" );
        CHECK( env.render("{% if age == 25 %}+{% endif %}{% if age == 29 %}+{% else %}-{% endif %}", data) == "+" );

        CHECK_THROWS_WITH( env.render("{% if is_happy %}{% if is_happy %}{% endif %}", data), "[inja.exception.parser_error] unmatched if" );
        CHECK_THROWS_WITH( env.render("{% if is_happy %}{% else if is_happy %}{% end if %}", data), "[inja.exception.parser_error] expected statement, got 'end'" );
    }

    SECTION("line statements") {
        CHECK( env.render(R"(## if is_happy
Yeah!
## endif)", data) == R"(Yeah!
)" );

        CHECK( env.render(R"(## if is_happy
## if is_happy
Yeah!
## endif
## endif    )", data) == R"(Yeah!
)" );
}
}


TEST_CASE("functions") {
    inja::Environment env;

    json data;
    data["name"] = "Peter";
    data["city"] = "New York";
    data["names"] = {"Jeff", "Seb", "Peter", "Tom"};
    data["temperature"] = 25.6789;
    data["brother"]["name"] = "Chris";
    data["brother"]["daughters"] = {"Maria", "Helen"};
    data["property"] = "name";
    data["age"] = 29;
    data["i"] = 1;
    data["is_happy"] = true;
    data["is_sad"] = false;
    data["vars"] = {2, 3, 4, 0, -1, -2, -3};

    SECTION("upper") {
        CHECK( env.render("{{ upper(name) }}", data) == "PETER" );
        CHECK( env.render("{{ upper(  name  ) }}", data) == "PETER" );
        CHECK( env.render("{{ upper(city) }}", data) == "NEW YORK" );
        CHECK( env.render("{{ upper(upper(name)) }}", data) == "PETER" );
        // CHECK_THROWS_WITH( env.render("{{ upper(5) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be string, but is number" );
        // CHECK_THROWS_WITH( env.render("{{ upper(true) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be string, but is boolean" );
    }

    SECTION("lower") {
        CHECK( env.render("{{ lower(name) }}", data) == "peter" );
        CHECK( env.render("{{ lower(city) }}", data) == "new york" );
        // CHECK_THROWS_WITH( env.render("{{ lower(5.45) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be string, but is number" );
    }

    SECTION("range") {
        CHECK( env.render("{{ range(2) }}", data) == "[0,1]" );
        CHECK( env.render("{{ range(4) }}", data) == "[0,1,2,3]" );
        // CHECK_THROWS_WITH( env.render("{{ range(name) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be number, but is string" );
    }

    SECTION("length") {
        CHECK( env.render("{{ length(names) }}", data) == "4" ); // Length of array
        CHECK( env.render("{{ length(name) }}", data) == "5" ); // Length of string
        // CHECK_THROWS_WITH( env.render("{{ length(5) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be array, but is number" );
    }

    SECTION("sort") {
        CHECK( env.render("{{ sort([3, 2, 1]) }}", data) == "[1,2,3]" );
        CHECK( env.render("{{ sort([\"bob\", \"charlie\", \"alice\"]) }}", data) == "[\"alice\",\"bob\",\"charlie\"]" );
        // CHECK_THROWS_WITH( env.render("{{ sort(5) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be array, but is number" );
    }

    SECTION("at") {
        CHECK( env.render("{{ at(names, 0) }}", data) == "Jeff" );
        CHECK( env.render("{{ at(names, i) }}", data) == "Seb" );
    }

    SECTION("first") {
        CHECK( env.render("{{ first(names) }}", data) == "Jeff" );
        // CHECK_THROWS_WITH( env.render("{{ first(5) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be array, but is number" );
    }

    SECTION("last") {
        CHECK( env.render("{{ last(names) }}", data) == "Tom" );
        // CHECK_THROWS_WITH( env.render("{{ last(5) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be array, but is number" );
    }

    SECTION("round") {
        CHECK( env.render("{{ round(4, 0) }}", data) == "4.0" );
        CHECK( env.render("{{ round(temperature, 2) }}", data) == "25.68" );
        // CHECK_THROWS_WITH( env.render("{{ round(name, 2) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be number, but is string" );
    }

    SECTION("divisibleBy") {
        CHECK( env.render("{{ divisibleBy(50, 5) }}", data) == "true" );
        CHECK( env.render("{{ divisibleBy(12, 3) }}", data) == "true" );
        CHECK( env.render("{{ divisibleBy(11, 3) }}", data) == "false" );
        // CHECK_THROWS_WITH( env.render("{{ divisibleBy(name, 2) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be number, but is string" );
    }

    SECTION("odd") {
        CHECK( env.render("{{ odd(11) }}", data) == "true" );
        CHECK( env.render("{{ odd(12) }}", data) == "false" );
        // CHECK_THROWS_WITH( env.render("{{ odd(name) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be number, but is string" );
    }

    SECTION("even") {
        CHECK( env.render("{{ even(11) }}", data) == "false" );
        CHECK( env.render("{{ even(12) }}", data) == "true" );
        // CHECK_THROWS_WITH( env.render("{{ even(name) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be number, but is string" );
    }

    SECTION("max") {
        CHECK( env.render("{{ max([1, 2, 3]) }}", data) == "3" );
        CHECK( env.render("{{ max([-5.2, 100.2, 2.4]) }}", data) == "100.2" );
        // CHECK_THROWS_WITH( env.render("{{ max(name) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be array, but is string" );
    }

    SECTION("min") {
        CHECK( env.render("{{ min([1, 2, 3]) }}", data) == "1" );
        CHECK( env.render("{{ min([-5.2, 100.2, 2.4]) }}", data) == "-5.2" );
        // CHECK_THROWS_WITH( env.render("{{ min(name) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be array, but is string" );
    }

    SECTION("float") {
        CHECK( env.render("{{ float(\"2.2\") == 2.2 }}", data) == "true" );
        CHECK( env.render("{{ float(\"-1.25\") == -1.25 }}", data) == "true" );
        // CHECK_THROWS_WITH( env.render("{{ max(name) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be array, but is string" );
    }

    SECTION("int") {
        CHECK( env.render("{{ int(\"2\") == 2 }}", data) == "true" );
        CHECK( env.render("{{ int(\"-1.25\") == -1 }}", data) == "true" );
        // CHECK_THROWS_WITH( env.render("{{ max(name) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be array, but is string" );
    }

    SECTION("default") {
        CHECK( env.render("{{ default(11, 0) }}", data) == "11" );
        CHECK( env.render("{{ default(nothing, 0) }}", data) == "0" );
        CHECK( env.render("{{ default(name, \"nobody\") }}", data) == "Peter" );
        CHECK( env.render("{{ default(surname, \"nobody\") }}", data) == "nobody" );
        CHECK( env.render("{{ default(surname, \"{{ surname }}\") }}", data) == "{{ surname }}" );
        CHECK_THROWS_WITH( env.render("{{ default(surname, lastname) }}", data), "[inja.exception.render_error] variable 'lastname' not found" );
    }

    SECTION("exists") {
        CHECK( env.render("{{ exists(\"name\") }}", data) == "true" );
        CHECK( env.render("{{ exists(\"zipcode\") }}", data) == "false" );
        CHECK( env.render("{{ exists(name) }}", data) == "false" );
        CHECK( env.render("{{ exists(property) }}", data) == "true" );
    }

    SECTION("existsIn") {
        CHECK( env.render("{{ existsIn(brother, \"name\") }}", data) == "true" );
        CHECK( env.render("{{ existsIn(brother, \"parents\") }}", data) == "false" );
        CHECK( env.render("{{ existsIn(brother, property) }}", data) == "true" );
        CHECK( env.render("{{ existsIn(brother, name) }}", data) == "false" );
        CHECK_THROWS_WITH( env.render("{{ existsIn(sister, \"lastname\") }}", data), "[inja.exception.render_error] variable 'sister' not found" );
        CHECK_THROWS_WITH( env.render("{{ existsIn(brother, sister) }}", data), "[inja.exception.render_error] variable 'sister' not found" );
    }

    SECTION("isType") {
        CHECK( env.render("{{ isBoolean(is_happy) }}", data) == "true" );
        CHECK( env.render("{{ isBoolean(vars) }}", data) == "false" );
        CHECK( env.render("{{ isNumber(age) }}", data) == "true" );
        CHECK( env.render("{{ isNumber(name) }}", data) == "false" );
        CHECK( env.render("{{ isInteger(age) }}", data) == "true" );
        CHECK( env.render("{{ isInteger(is_happy) }}", data) == "false" );
        CHECK( env.render("{{ isFloat(temperature) }}", data) == "true" );
        CHECK( env.render("{{ isFloat(age) }}", data) == "false" );
        CHECK( env.render("{{ isObject(brother) }}", data) == "true" );
        CHECK( env.render("{{ isObject(vars) }}", data) == "false" );
        CHECK( env.render("{{ isArray(vars) }}", data) == "true" );
        CHECK( env.render("{{ isArray(name) }}", data) == "false" );
        CHECK( env.render("{{ isString(name) }}", data) == "true" );
        CHECK( env.render("{{ isString(names) }}", data) == "false" );
    }
}


TEST_CASE("callbacks") {
    inja::Environment env;
    json data;
    data["age"] = 28;

    env.add_callback("double", 1, [](inja::Arguments& args) {
        int number = args.at(0)->get<int>();
        return 2 * number;
    });

    env.add_callback("half", 1, [](inja::Arguments args) {
        int number = args.at(0)->get<int>();
        return number / 2;
    });

    std::string greet = "Hello";
    env.add_callback("double-greetings", 0, [greet](inja::Arguments args) {
        return greet + " " + greet + "!";
    });

    env.add_callback("multiply", 2, [](inja::Arguments args) {
        double number1 = args.at(0)->get<double>();
        auto number2 = args.at(1)->get<double>();
        return number1 * number2;
    });

    env.add_callback("multiply", 3, [](inja::Arguments args) {
        double number1 = args.at(0)->get<double>();
        double number2 = args.at(1)->get<double>();
        double number3 = args.at(2)->get<double>();
        return number1 * number2 * number3;
    });

    env.add_callback("multiply", 0, [](inja::Arguments args) {
        return 1.0;
    });

    CHECK( env.render("{{ double(age) }}", data) == "56" );
    CHECK( env.render("{{ half(age) }}", data) == "14" );
    CHECK( env.render("{{ double-greetings }}", data) == "Hello Hello!" );
    CHECK( env.render("{{ double-greetings() }}", data) == "Hello Hello!" );
    CHECK( env.render("{{ multiply(4, 5) }}", data) == "20.0" );
    CHECK( env.render("{{ multiply(3, 4, 5) }}", data) == "60.0" );
    CHECK( env.render("{{ multiply }}", data) == "1.0" );
}


TEST_CASE("combinations") {
    inja::Environment env;
    json data;
    data["name"] = "Peter";
    data["city"] = "Brunswick";
    data["age"] = 29;
    data["names"] = {"Jeff", "Seb"};
    data["brother"]["name"] = "Chris";
    data["brother"]["daughters"] = {"Maria", "Helen"};
    data["brother"]["daughter0"] = { { "name", "Maria" } };
    data["is_happy"] = true;

    CHECK( env.render("{% if upper(\"Peter\") == \"PETER\" %}TRUE{% endif %}", data) == "TRUE" );
    CHECK( env.render("{% if lower(upper(name)) == \"peter\" %}TRUE{% endif %}", data) == "TRUE" );
    CHECK( env.render("{% for i in range(4) %}{{ loop.index1 }}{% endfor %}", data) == "1234" );
}

TEST_CASE("templates") {
    json data;
    data["name"] = "Peter";
    data["city"] = "Brunswick";
    data["is_happy"] = true;

    SECTION("reuse") {
        inja::Environment env;
        inja::Template temp = env.parse("{% if is_happy %}{{ name }}{% else %}{{ city }}{% endif %}");

        CHECK( env.render(temp, data) == "Peter" );

        data["is_happy"] = false;

        CHECK( env.render(temp, data) == "Brunswick" );
    }

    SECTION("include") {
        inja::Environment env;
        inja::Template t1 = env.parse("Hello {{ name }}");
        env.include_template("greeting", t1);

        inja::Template t2 = env.parse("{% include \"greeting\" %}!");
        CHECK( env.render(t2, data) == "Hello Peter!" );
        CHECK_THROWS_WITH( env.parse("{% include \"does-not-exist\" %}!"), "[inja.exception.file_error] failed accessing file at 'does-not-exist'" );
    }

    SECTION("include-in-loop") {
        json loop_data;
        loop_data["cities"] = json::array({{{"name", "Munich"}}, {{"name", "New York"}}});

        inja::Environment env;
        env.include_template("city.tpl", env.parse("{{ loop.index }}:{{ city.name }};"));

        CHECK( env.render("{% for city in cities %}{% include \"city.tpl\" %}{% endfor %}", loop_data) == "0:Munich;1:New York;" );
    }
}


TEST_CASE("other-syntax") {
    json data;
    data["name"] = "Peter";
    data["city"] = "Brunswick";
    data["age"] = 29;
    data["names"] = {"Jeff", "Seb"};
    data["brother"]["name"] = "Chris";
    data["brother"]["daughters"] = {"Maria", "Helen"};
    data["brother"]["daughter0"] = { { "name", "Maria" } };
    data["is_happy"] = true;

    SECTION("variables") {
        inja::Environment env;
        env.set_element_notation(inja::ElementNotation::Pointer);

        CHECK( env.render("{{ name }}", data) == "Peter" );
        CHECK( env.render("Hello {{ names/1 }}!", data) == "Hello Seb!" );
        CHECK( env.render("Hello {{ brother/name }}!", data) == "Hello Chris!" );
        CHECK( env.render("Hello {{ brother/daughter0/name }}!", data) == "Hello Maria!" );

        CHECK_THROWS_WITH( env.render("{{unknown/name}}", data), "[inja.exception.render_error] variable 'unknown/name' not found" );
    }

    SECTION("other expression syntax") {
        inja::Environment env;

        CHECK( env.render("Hello {{ name }}!", data) == "Hello Peter!" );

        env.set_expression("(&", "&)");

        CHECK( env.render("Hello {{ name }}!", data) == "Hello {{ name }}!" );
        CHECK( env.render("Hello (& name &)!", data) == "Hello Peter!" );
    }

    SECTION("other comment syntax") {
        inja::Environment env;
        env.set_comment("(&", "&)");

        CHECK( env.render("Hello {# Test #}", data) == "Hello {# Test #}" );
        CHECK( env.render("Hello (& Test &)", data) == "Hello " );
    }

    SECTION("multiple changes") {
        inja::Environment env;
        env.set_line_statement("$$");
        env.set_expression("<%", "%>");

        std::string string_template = R"DELIM(Hello <%name%>
$$ if name == "Peter"
    You really are <%name%>
$$ endif
)DELIM";
            CHECK( env.render(string_template, data) == "Hello Peter\n    You really are Peter\n");
    }
}
