/**
 * Copyright 2017 Google Inc.
 *
 * 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 <algorithm>
#include <iostream>

#include "fancontroller.hpp"
#include "util.hpp"
#include "zone.hpp"

std::unique_ptr<PIDController> FanController::CreateFanPid(
    std::shared_ptr<PIDZone> owner,
    const std::string& id,
    std::vector<std::string>& inputs,
    ec::pidinfo initial)
{
    auto fan = std::make_unique<FanController>(id, inputs, owner);
    ec::pid_info_t* info = fan->get_pid_info();

    InitializePIDStruct(info, &initial);

    return fan;
}

float FanController::input_proc(void)
{
    float sum = 0;
    double value = 0;
    std::vector<int64_t> values;
    std::vector<int64_t>::iterator result;

    try
    {
        for (const auto& name : _inputs)
        {
            value = _owner->getCachedValue(name);
            /* If we have a fan we can't read, its value will be 0 for at least
             * some boards, while others... the fan will drop off dbus (if
             * that's how it's being read and in that case its value will never
             * be updated anymore, which is relatively harmless, except, when
             * something tries to read its value through IPMI, and can't, they
             * sort of have to guess -- all the other fans are reporting, why
             * not this one?  Maybe it's unable to be read, so it's "bad."
             */
            if (value > 0)
            {
                values.push_back(value);
                sum += value;
            }
        }
    }
    catch (const std::exception& e)
    {
        std::cerr << "exception on input_proc.\n";
        throw;
    }

    if (values.size() > 0)
    {
        /* When this is a configuration option in a later update, this code
         * will be updated.
         */
        //value = sum / _inputs.size();

        /* the fan PID algorithm was unstable with average, and seemed to work
         * better with minimum.  I had considered making this choice a variable
         * in the configuration, and I will.
         */
        result = std::min_element(values.begin(), values.end());
        value = *result;
    }

    return static_cast<float>(value);
}

float FanController::setpt_proc(void)
{
    float maxRPM = _owner->getMaxRPMRequest();

    // store for reference, and check if more or less.
    float prev = get_setpoint();

    if (maxRPM > prev)
    {
        setFanDirection(FanSpeedDirection::UP);
    }
    else if (prev > maxRPM)
    {
        setFanDirection(FanSpeedDirection::DOWN);
    }
    else
    {
        setFanDirection(FanSpeedDirection::NEUTRAL);
    }

    set_setpoint(maxRPM);

    return (maxRPM);
}

void FanController::output_proc(float value)
{
    float percent = value;

    /* If doing tuning logging, don't go into failsafe mode. */
#ifndef __TUNING_LOGGING__
    if (_owner->getFailSafeMode())
    {
        /* In case it's being set to 100% */
        if (percent < _owner->getFailSafePercent())
        {
            percent = _owner->getFailSafePercent();
        }
    }
#endif

    // value and kFanFailSafeDutyCycle are 10 for 10% so let's fix that.
    percent /= 100;

    // PidSensorMap for writing.
    for (auto& it : _inputs)
    {
        auto& sensor = _owner->getSensor(it);
        sensor->write(static_cast<double>(percent));
    }

    return;
}

