/**
 * 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::milliseconds 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, bus);

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