/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed 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 <chrono>
#include <string>
#include <thread>

#include <android-base/logging.h>
#include <android-base/properties.h>
#include <hidl/HidlTransportSupport.h>
#include <utils/StrongPointer.h>

// Select the implementation
#include <esecpp/NxpPn80tNqNci.h>
using EseInterfaceImpl = android::NxpPn80tNqNci;

#include "Weaver.h"

using android::OK;
using android::sp;
using android::status_t;
using android::hardware::configureRpcThreadpool;
using android::hardware::joinRpcThreadpool;

using namespace std::chrono_literals;

// HALs
using android::esed::Weaver;

int main(int /* argc */, char** /* argv */) {
    LOG(INFO) << "Waiting for property...";
    android::base::WaitForProperty("init.svc.ese_load", "stopped");
    LOG(INFO) << "Starting esed...";

    // Open connection to the eSE
    EseInterfaceImpl ese;
    uint32_t failCount = 0;
    while (true) {
        ese.init();
        if (ese.open() < 0) {
            std::string errMsg = "Failed to open connection to eSE";
            if (ese.error()) {
                errMsg += " (" + std::to_string(ese.error_code()) + "): " + ese.error_message();
            } else {
                errMsg += ": reason unknown";
            }
            LOG(ERROR) << errMsg;

            // FIXME: this loop with sleep is a hack to avoid the process repeatedly crashing
            ++failCount;
            std::this_thread::sleep_for(failCount * 5s);
            continue;
        }
        LOG(INFO) << "Opened connection to the eSE";
        break;
    }
    // Close it until use.
    ese.close();


    // This will be a single threaded daemon. This is important as libese is not
    // thread safe so we use binder to synchronize requests for us.
    constexpr bool thisThreadWillJoinPool = true;
    configureRpcThreadpool(1, thisThreadWillJoinPool);

    // Create Weaver HAL instance
    sp<Weaver> weaver = new Weaver{ese};
    const status_t status = weaver->registerAsService();
    if (status != OK) {
        LOG(ERROR) << "Failed to register Weaver as a service (status: " << status << ")";
    }


    joinRpcThreadpool();
    return -1; // Should never reach here
}
