<?php

/**
 * HasLimits.php
 *
 * -Description-
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 *
 * @link       https://www.librenms.org
 *
 * @copyright  2025 Tony Murray
 * @author     Tony Murray <murraytony@gmail.com>
 */

namespace App\Models\Traits;

use LibreNMS\Enum\Severity;

trait HasThresholds
{
    public function currentStatus(): Severity
    {
        if ($this->sensor_class == 'state' && $this instanceof \App\Models\Sensor) {
            return $this->currentTranslation()?->severity() ?? Severity::Unknown;
        }

        if ($this->sensor_current === null) {
            return Severity::Unknown;
        }

        if ($this->sensor_limit !== null && $this->sensor_current >= $this->sensor_limit) {
            return Severity::Error;
        }
        if ($this->sensor_limit_low !== null && $this->sensor_current <= $this->sensor_limit_low) {
            return Severity::Error;
        }

        if ($this->sensor_limit_warn !== null && $this->sensor_current >= $this->sensor_limit_warn) {
            return Severity::Warning;
        }

        if ($this->sensor_limit_low_warn !== null && $this->sensor_current <= $this->sensor_limit_low_warn) {
            return Severity::Warning;
        }

        return Severity::Ok;
    }

    public function hasThresholds(): bool
    {
        return $this->sensor_limit_low !== null
            || $this->sensor_limit_low_warn !== null
            || $this->sensor_limit_warn !== null
            || $this->sensor_limit !== null;
    }

    public function doesntHaveThresholds(): bool
    {
        return ! $this->hasThresholds();
    }

    public function guessLimits(bool $high, bool $low): void
    {
        // Get the string value for matching (supports both enum casts and raw strings)
        $class = $this->sensor_class instanceof \BackedEnum ? $this->sensor_class->value : $this->sensor_class;

        if ($high) {
            $this->sensor_limit = match ($class) {
                'temperature' => $this->sensor_current + 20,
                'voltage' => $this->sensor_current * 1.15,
                'humidity' => 70,
                'fanspeed' => $this->sensor_current * 1.80,
                'power_factor' => 1,
                'signal' => -30,
                'load' => 80,
                'airflow', 'snr', 'frequency', 'pressure', 'cooling' => $this->sensor_current * 1.05,
                default => null,
            };
        }

        if ($low) {
            $this->sensor_limit_low = match ($class) {
                'temperature' => $this->sensor_current - 10,
                'voltage' => $this->sensor_current * 0.85,
                'humidity' => 30,
                'fanspeed' => $this->sensor_current * 0.80,
                'power_factor' => -1,
                'signal' => -80,
                'airflow', 'snr', 'frequency', 'pressure', 'cooling' => $this->sensor_current * 0.95,
                default => null,
            };
        }
    }
}
