/**
 * Copyright © 2017 IBM Corporation
 *
 * 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 <iostream>
#include <phosphor-logging/log.hpp>
#include "argument.hpp"
#include "pgood_monitor.hpp"
#include "runtime_monitor.hpp"
#include "ucd90160.hpp"

using namespace witherspoon::power;
using namespace phosphor::logging;

int main(int argc, char** argv)
{
    ArgumentParser args{argc, argv};
    auto action = args["action"];

    if ((action != "pgood-monitor") && (action != "runtime-monitor"))
    {
        std::cerr << "Invalid action\n";
        args.usage(argv);
        exit(EXIT_FAILURE);
    }

    auto i = strtoul(args["interval"].c_str(), nullptr, 10);
    if (i == 0)
    {
        std::cerr << "Invalid interval value\n";
        exit(EXIT_FAILURE);
    }

    std::chrono::seconds interval{i};

    sd_event* e = nullptr;
    auto r = sd_event_default(&e);
    if (r < 0)
    {
        log<level::ERR>("sd_event_default() failed",
                        entry("ERROR=%s", strerror(-r)));
        exit(EXIT_FAILURE);
    }

    event::Event event{e};
    auto bus = sdbusplus::bus::new_default();
    bus.attach_event(event.get(), SD_EVENT_PRIORITY_NORMAL);

    auto device = std::make_unique<UCD90160>(0);

    std::unique_ptr<DeviceMonitor> monitor;

    if (action == "pgood-monitor")
    {
        //If PGOOD doesn't turn on within a certain
        //time, analyze the device for errors
        monitor = std::make_unique<PGOODMonitor>(
                std::move(device), bus, event, interval);
    }
    else //runtime-monitor
    {
        //Continuously monitor this device both by polling
        //and on 'power lost' signals.
        monitor = std::make_unique<RuntimeMonitor>(
                std::move(device), bus, event, interval);
    }

    return monitor->run();
}
