// Copyright (c) 2019 Pantor. All rights reserved.

#include "doctest/doctest.h"
#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};


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

    SUBCASE("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");
    }

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

    SUBCASE("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" );
    }

    SUBCASE("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");
    }

    SUBCASE("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'");
    }

    SUBCASE("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};

    SUBCASE("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" );
    }

    SUBCASE("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" );
    }

    SUBCASE("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" );
    }

    SUBCASE("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" );
    }

    SUBCASE("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" );
    }

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

    SUBCASE("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" );
    }

    SUBCASE("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" );
    }

    SUBCASE("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" );
    }

    SUBCASE("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" );
    }

    SUBCASE("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" );
    }

    SUBCASE("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" );
    }

    SUBCASE("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" );
    }

    SUBCASE("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" );
    }

    SUBCASE("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" );
    }

    SUBCASE("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" );
    }

    SUBCASE("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");
    }

    SUBCASE("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");
    }

    SUBCASE("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");
    }

    SUBCASE("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;

    SUBCASE("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");
    }

    SUBCASE("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'");
    }

    SUBCASE("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;

    SUBCASE("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");
    }

    SUBCASE("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!");
    }

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

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

    SUBCASE("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");
    }
}
