/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
*/

#include "mpin_sdk.h"
#include "contexts/auto_context.h"
#include "common/http_request.h"
#include "common/access_number_thread.h"
#include "CvTime.h"
#include "CvLogger.h"

#define BOOST_TEST_MODULE Simple testcases
#include "boost/test/included/unit_test.hpp"

typedef MPinSDK::User User;
typedef MPinSDK::UserPtr UserPtr;
typedef MPinSDK::Status Status;
typedef MPinSDK::String String;

static AutoContext context;
static MPinSDK sdk;
static MPinSDK::StringMap config;
static const char *backend = "http://192.168.98.98:8005";

using namespace boost::unit_test;

static std::ostream& operator<<(std::ostream& ostr, const Status& s)
{
    ostr << s.GetStatusCode();
    return ostr;
}

BOOST_AUTO_TEST_CASE(testNoInit)
{
    unit_test_log.set_threshold_level(log_messages);

    BOOST_MESSAGE("Starting testNoInit...");

    CvShared::InitLogger("cvlog.txt", CvShared::enLogLevel_None);

    int argc = framework::master_test_suite().argc;
    if(argc > 1)
    {
        char **argv = framework::master_test_suite().argv;
        backend = argv[1];
    }

    Status s = sdk.TestBackend("12354");
    BOOST_CHECK_EQUAL(s, Status::FLOW_ERROR);

    s = sdk.SetBackend("12354");
    BOOST_CHECK_EQUAL(s, Status::FLOW_ERROR);

    UserPtr user = sdk.MakeNewUser("testUser");

    s = sdk.StartRegistration(user);
    BOOST_CHECK_EQUAL(s, Status::FLOW_ERROR);
    BOOST_CHECK_EQUAL(user->GetState(), User::INVALID);

    s = sdk.RestartRegistration(user);
    BOOST_CHECK_EQUAL(s, Status::FLOW_ERROR);
    BOOST_CHECK_EQUAL(user->GetState(), User::INVALID);

    s = sdk.ConfirmRegistration(user);
    BOOST_CHECK_EQUAL(s, Status::FLOW_ERROR);
    BOOST_CHECK_EQUAL(user->GetState(), User::INVALID);

    s = sdk.FinishRegistration(user, "");
    BOOST_CHECK_EQUAL(s, Status::FLOW_ERROR);
    BOOST_CHECK_EQUAL(user->GetState(), User::INVALID);

    s = sdk.StartAuthentication(user);
    BOOST_CHECK_EQUAL(s, Status::FLOW_ERROR);
    BOOST_CHECK_EQUAL(user->GetState(), User::INVALID);

    s = sdk.FinishAuthentication(user, "");
    BOOST_CHECK_EQUAL(s, Status::FLOW_ERROR);
    BOOST_CHECK_EQUAL(user->GetState(), User::INVALID);

    String authResultData;
    s = sdk.FinishAuthentication(user, "", authResultData);
    BOOST_CHECK_EQUAL(s, Status::FLOW_ERROR);
    BOOST_CHECK_EQUAL(user->GetState(), User::INVALID);

    MPinSDK::OTP otp;
    s = sdk.FinishAuthenticationOTP(user, "", otp);
    BOOST_CHECK_EQUAL(s, Status::FLOW_ERROR);
    BOOST_CHECK_EQUAL(user->GetState(), User::INVALID);

    s = sdk.FinishAuthenticationAN(user, "", "");
    BOOST_CHECK_EQUAL(s, Status::FLOW_ERROR);
    BOOST_CHECK_EQUAL(user->GetState(), User::INVALID);

    BOOST_MESSAGE("    testNoInit finished");
}

BOOST_AUTO_TEST_CASE(testInit)
{
    BOOST_MESSAGE("Starting testInit...");

    config.Put(MPinSDK::CONFIG_BACKEND, backend);

    Status s = sdk.Init(config, &context);

    BOOST_CHECK_EQUAL(s, Status::OK);

    BOOST_MESSAGE("    testInit finished");
}

BOOST_AUTO_TEST_CASE(testBackend)
{
    BOOST_MESSAGE("Starting testBackend...");

    Status s = sdk.TestBackend("https://m-pindemo.certivox.org");
    BOOST_CHECK_EQUAL(s, Status::OK);

    s = sdk.TestBackend("https://blabla.certivox.org");
    BOOST_CHECK_NE(s, Status::OK);

    BOOST_MESSAGE("    testBackend finished");
}

BOOST_AUTO_TEST_CASE(setBackend)
{
    BOOST_MESSAGE("Starting setBackend...");

    Status s = sdk.SetBackend("https://blabla.certivox.org");
    BOOST_CHECK_NE(s, Status::OK);

    s = sdk.SetBackend(backend);
    BOOST_CHECK_EQUAL(s, Status::OK);

    BOOST_MESSAGE("    setBackend finished");
}

BOOST_AUTO_TEST_CASE(testUsers1)
{
    BOOST_MESSAGE("Starting testUsers1...");

    UserPtr user = sdk.MakeNewUser("testUser");
    BOOST_CHECK_EQUAL(user->GetState(), User::INVALID);

    Status s = sdk.StartRegistration(user);

    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::ACTIVATED);

    sdk.DeleteUser(user);
    std::vector<UserPtr> users;
    sdk.ListUsers(users);
    BOOST_CHECK(users.empty());

    BOOST_MESSAGE("    testUsers1 finished");
}

BOOST_AUTO_TEST_CASE(testUsers2)
{
    BOOST_MESSAGE("Starting testUsers2...");

    UserPtr user = sdk.MakeNewUser("testUser");
    Status s = sdk.StartRegistration(user);

    std::vector<UserPtr> users;
    sdk.ListUsers(users);
    BOOST_CHECK_EQUAL(users.size(), 1);

    std::vector<String> backends;
    sdk.ListBackends(backends);
    BOOST_CHECK_EQUAL(backends.size(), 1);

    if(!backends.empty())
    {
        users.clear();
        sdk.ListUsers(users, backends[0]);
        BOOST_CHECK_EQUAL(users.size(), 1);
    }

    users.clear();
    sdk.ListUsers(users, backend);
    BOOST_CHECK_EQUAL(users.size(), 1);

    sdk.DeleteUser(user);

    BOOST_MESSAGE("    testUsers2 finished");
}

BOOST_AUTO_TEST_CASE(testUsers3)
{
    BOOST_MESSAGE("Starting testUsers3...");

    UserPtr user = sdk.MakeNewUser("testUser");

    Status s = sdk.StartAuthentication(user);
    BOOST_CHECK_EQUAL(s, Status::FLOW_ERROR);
    BOOST_CHECK_EQUAL(user->GetState(), User::INVALID);

    s = sdk.FinishRegistration(user, "");
    BOOST_CHECK_EQUAL(s, Status::FLOW_ERROR);
    BOOST_CHECK_EQUAL(user->GetState(), User::INVALID);

    s = sdk.RestartRegistration(user);
    BOOST_CHECK_EQUAL(s, Status::FLOW_ERROR);
    BOOST_CHECK_EQUAL(user->GetState(), User::INVALID);

    BOOST_MESSAGE("    testUsers3 finished");
}

BOOST_AUTO_TEST_CASE(testUsers4)
{
    BOOST_MESSAGE("Starting testUsers4...");

    int count = 10;
    for(int i = 0; i < count; ++i)
    {
        String id;
        id.Format("testUser%03d", i);
        UserPtr user = sdk.MakeNewUser(id);

        Status s = sdk.StartRegistration(user);
        BOOST_CHECK_EQUAL(s, Status::OK);
        BOOST_CHECK_EQUAL(user->GetState(), User::ACTIVATED);
    }

    std::vector<UserPtr> users;
    sdk.ListUsers(users);
    BOOST_CHECK_EQUAL(users.size(), count);

    for(std::vector<UserPtr>::iterator i = users.begin(); i != users.end(); ++i)
    {
        UserPtr user = *i;
        sdk.DeleteUser(user);
    }

    sdk.ListUsers(users);
    BOOST_CHECK(users.empty());

    BOOST_MESSAGE("    testUsers4 finished");
}

BOOST_AUTO_TEST_CASE(testUsers5)
{
    BOOST_MESSAGE("Starting testUsers5...");

    UserPtr user = sdk.MakeNewUser("testUser");
    sdk.StartRegistration(user);

    BOOST_CHECK(!sdk.CanLogout(user));
    BOOST_CHECK(!sdk.Logout(user));
    sdk.DeleteUser(user);

    BOOST_MESSAGE("    testUsers5 finished");
}


BOOST_AUTO_TEST_CASE(testRegister1)
{
    BOOST_MESSAGE("Starting testRegister1...");

    UserPtr user = sdk.MakeNewUser("testUser");

    Status s = sdk.StartRegistration(user);
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::ACTIVATED);

    s = sdk.ConfirmRegistration(user);
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::ACTIVATED);

    s = sdk.FinishRegistration(user, "1234");
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::REGISTERED);

    sdk.DeleteUser(user);

    BOOST_MESSAGE("    testRegister1 finished");
}

BOOST_AUTO_TEST_CASE(testRegister2)
{
    BOOST_MESSAGE("Starting testRegister2...");

    UserPtr user = sdk.MakeNewUser("testUser");

    Status s = sdk.StartRegistration(user);
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::ACTIVATED);

    s = sdk.RestartRegistration(user);
    BOOST_CHECK_EQUAL(s, Status::FLOW_ERROR);
    BOOST_CHECK_EQUAL(user->GetState(), User::ACTIVATED);

    sdk.DeleteUser(user);

    BOOST_MESSAGE("    testRegister2 finished");
}

BOOST_AUTO_TEST_CASE(testRegister3)
{
    BOOST_MESSAGE("Starting testRegister3...");

    UserPtr user = sdk.MakeNewUser("");

    Status s = sdk.StartRegistration(user);
    BOOST_CHECK_EQUAL(s, Status::HTTP_REQUEST_ERROR);
    BOOST_CHECK_EQUAL(user->GetState(), User::INVALID);

    s = sdk.FinishRegistration(user, "");
    BOOST_CHECK_EQUAL(s, Status::FLOW_ERROR);
    BOOST_CHECK_EQUAL(user->GetState(), User::INVALID);

    sdk.DeleteUser(user);

    BOOST_MESSAGE("    testRegister3 finished");
}

BOOST_AUTO_TEST_CASE(testRegister4)
{
    BOOST_MESSAGE("Starting testRegister4...");

    UserPtr user = sdk.MakeNewUser("testUser");

    Status s = sdk.StartRegistration(user);
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::ACTIVATED);

    s = sdk.ConfirmRegistration(user);
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::ACTIVATED);

    s = sdk.FinishRegistration(user, "");
    BOOST_CHECK_EQUAL(s, Status::PIN_INPUT_CANCELED);
    BOOST_CHECK_EQUAL(user->GetState(), User::ACTIVATED);

    sdk.DeleteUser(user);

    BOOST_MESSAGE("    testRegister4 finished");
}

BOOST_AUTO_TEST_CASE(testAuthenticate1)
{
    BOOST_MESSAGE("Starting testAuthenticate1...");

    UserPtr user = sdk.MakeNewUser("testUser");

    Status s = sdk.StartRegistration(user);
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::ACTIVATED);

    s = sdk.ConfirmRegistration(user);
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::ACTIVATED);

    s = sdk.FinishRegistration(user, "1234");
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::REGISTERED);

    s = sdk.StartAuthentication(user);
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::REGISTERED);

    s = sdk.FinishAuthentication(user, "1234");
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::REGISTERED);

    String authData;
    //s = sdk.StartAuthentication(user);
    s = sdk.FinishAuthentication(user, "1234", authData);
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::REGISTERED);

    //s = sdk.StartAuthentication(user);
    s = sdk.FinishAuthentication(user, "1235");
    BOOST_CHECK_EQUAL(s, Status::INCORRECT_PIN);
    BOOST_CHECK_EQUAL(user->GetState(), User::REGISTERED);

    //s = sdk.StartAuthentication(user);
    s = sdk.FinishAuthentication(user, "1234");
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::REGISTERED);

    sdk.DeleteUser(user);

    BOOST_MESSAGE("    testAuthenticate1 finished");
}

BOOST_AUTO_TEST_CASE(testAuthenticate2)
{
    BOOST_MESSAGE("Starting testAuthenticate2...");

    UserPtr user = sdk.MakeNewUser("testUser");

    Status s = sdk.StartRegistration(user);
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::ACTIVATED);

    s = sdk.ConfirmRegistration(user);
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::ACTIVATED);

    s = sdk.FinishRegistration(user, "1234");
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::REGISTERED);

    s = sdk.StartAuthentication(user);
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::REGISTERED);

    s = sdk.FinishAuthentication(user, "1111");
    BOOST_CHECK_EQUAL(s, Status::INCORRECT_PIN);
    BOOST_CHECK_EQUAL(user->GetState(), User::REGISTERED);

    //s = sdk.StartAuthentication(user);
    s = sdk.FinishAuthentication(user, "1111");
    BOOST_CHECK_EQUAL(s, Status::INCORRECT_PIN);
    BOOST_CHECK_EQUAL(user->GetState(), User::REGISTERED);

    //s = sdk.StartAuthentication(user);
    s = sdk.FinishAuthentication(user, "1111");
    BOOST_CHECK_EQUAL(s, Status::INCORRECT_PIN);
    BOOST_CHECK_EQUAL(user->GetState(), User::BLOCKED);

    sdk.DeleteUser(user);

    BOOST_MESSAGE("    testAuthenticate2 finished");
}

BOOST_AUTO_TEST_CASE(testAuthenticateOTP)
{
    BOOST_MESSAGE("Starting testAuthenticateOTP...");

    UserPtr user = sdk.MakeNewUser("testUser");

    Status s = sdk.StartRegistration(user);
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::ACTIVATED);

    s = sdk.ConfirmRegistration(user);
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::ACTIVATED);

    s = sdk.FinishRegistration(user, "1234");
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::REGISTERED);

    s = sdk.StartAuthentication(user);
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::REGISTERED);

    MPinSDK::OTP otp;
    s = sdk.FinishAuthenticationOTP(user, "1234", otp);
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::REGISTERED);
    BOOST_CHECK_EQUAL(otp.status, Status::RESPONSE_PARSE_ERROR);

    sdk.DeleteUser(user);

    BOOST_MESSAGE("    testAuthenticateOTP finished");
}

static AccessNumberThread g_accessNumberThread;

BOOST_AUTO_TEST_CASE(testAuthenticateAN1)
{
    BOOST_MESSAGE("Starting testAuthenticateAN1...");

    // Register user
    UserPtr user = sdk.MakeNewUser("testUser");

    Status s = sdk.StartRegistration(user);
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::ACTIVATED);

    s = sdk.ConfirmRegistration(user);
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::ACTIVATED);

    s = sdk.FinishRegistration(user, "1234");
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::REGISTERED);

    // Request access number
    HttpRequest req;
    HttpRequest::StringMap headers;
    headers.Put("Content-Type", "application/json");
    headers.Put("Accept", "*/*");
    req.SetHeaders(headers);

    String url = String().Format("%s/rps/getAccessNumber", backend);
    bool res = req.Execute(MPinSDK::IHttpRequest::POST, url);
    BOOST_CHECK(res);
    BOOST_CHECK_EQUAL(req.GetHttpStatusCode(), 200);

    String data = req.GetResponseData();
    util::JsonObject json;
    res = json.Parse(data.c_str());
    BOOST_CHECK(res);

    String accessNumber = json.GetStringParam("accessNumber");
    BOOST_CHECK(accessNumber.length() > 0);

    // Start access number thread
    g_accessNumberThread.Start(backend, json.GetStringParam("webOTT"), sdk.GetClientParam("authenticateURL"));

    // Authenticate with access number
    s = sdk.StartAuthentication(user);
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::REGISTERED);

    s = sdk.FinishAuthenticationAN(user, "1234", accessNumber);
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::REGISTERED);

    // The backend *must* support logout data
    BOOST_CHECK(sdk.CanLogout(user));
    BOOST_CHECK(sdk.Logout(user));

    sdk.DeleteUser(user);

    BOOST_MESSAGE("    testAuthenticateAN1 finished");
}

BOOST_AUTO_TEST_CASE(testAuthenticateAN2)
{
    BOOST_MESSAGE("Starting testAuthenticateAN2...");

    // Register user
    UserPtr user = sdk.MakeNewUser("testUser");

    Status s = sdk.StartRegistration(user);
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::ACTIVATED);

    s = sdk.ConfirmRegistration(user);
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::ACTIVATED);

    s = sdk.FinishRegistration(user, "1234");
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::REGISTERED);

    // Request access number
    HttpRequest req;
    HttpRequest::StringMap headers;
    headers.Put("Content-Type", "application/json");
    headers.Put("Accept", "*/*");
    req.SetHeaders(headers);

    String url = String().Format("%s/rps/getAccessNumber", backend);
    bool res = req.Execute(MPinSDK::IHttpRequest::POST, url);
    BOOST_CHECK(res);
    BOOST_CHECK_EQUAL(req.GetHttpStatusCode(), 200);

    String data = req.GetResponseData();
    util::JsonObject json;
    res = json.Parse(data.c_str());
    BOOST_CHECK(res);

    String accessNumber = json.GetStringParam("accessNumber");
    BOOST_CHECK(accessNumber.length() > 0);

    // Simulate wrong access number
    String originalAccessNumber = accessNumber;
    accessNumber[3] += (char) 1;
    if(accessNumber[3] > '9')
    {
        accessNumber[3] = '0';
    }

    // Start access number thread
    g_accessNumberThread.Start(backend, json.GetStringParam("webOTT"), sdk.GetClientParam("authenticateURL"));

    // Authenticate with access number
    s = sdk.StartAuthentication(user);
    BOOST_CHECK_EQUAL(s, Status::OK);
    BOOST_CHECK_EQUAL(user->GetState(), User::REGISTERED);

    s = sdk.FinishAuthenticationAN(user, "1234", accessNumber);
    BOOST_CHECK_EQUAL(s, Status::INCORRECT_ACCESS_NUMBER);
    BOOST_CHECK_EQUAL(user->GetState(), User::REGISTERED);

    // The backend *must* support logout data
    BOOST_CHECK(!sdk.CanLogout(user));

    // Simulate wrong pin - must fail on access number validation too
    //s = sdk.StartAuthentication(user);
    s = sdk.FinishAuthenticationAN(user, "1233", accessNumber);
    BOOST_CHECK_EQUAL(s, Status::INCORRECT_ACCESS_NUMBER);
    BOOST_CHECK_EQUAL(user->GetState(), User::REGISTERED);

    // Fix access number - must fail with incorrect pin already
    accessNumber = originalAccessNumber;
    //s = sdk.StartAuthentication(user);
    s = sdk.FinishAuthenticationAN(user, "1233", accessNumber);
    BOOST_CHECK_EQUAL(s, Status::INCORRECT_PIN);
    BOOST_CHECK_EQUAL(user->GetState(), User::REGISTERED);

    sdk.DeleteUser(user);

    // Wait the AccessNumberThread to complete
    CvShared::SleepFor(CvShared::Millisecs(AccessNumberThread::RETRY_INTERVAL_MILLISEC * AccessNumberThread::MAX_TRIES).Value());

    BOOST_MESSAGE("    testAuthenticateAN2 finished");
}
