#!/usr/bin/env python3
#
# Copyright (C) 2026 Nethesis S.r.l.
# SPDX-License-Identifier: GPL-2.0-only
#

import os
import subprocess
import glob
from jinja2 import Environment, BaseLoader
from euci import EUci

PROMETHEUS_TEMPLATE = """# Prometheus client output
{% if enabled == '1' -%}
[[outputs.prometheus_client]]
  listen = "{{ listen_addr }}"
{%- if basic_auth_username and basic_auth_password %}
  basic_username = "{{ basic_auth_username }}"
  basic_password = "{{ basic_auth_password }}"
{%- endif %}
{%- endif %}
"""

PING_TEMPLATE = """# Ping input plugin - monitors ICMP ping to configured hosts
{% if pings -%}
[[inputs.ping]]
  urls = [{{ pings|map('tojson')|join(', ') }}]
  method = "native"
  count = 1
  ping_interval = 1.0
  deadline = 10

  [inputs.ping.tags]
    influxdb_db = "ping-metrics"
{%- endif %}
"""

DNS_TEMPLATE = """# DNS Query input plugin - monitors DNS resolution
{% if dns_domains -%}
[[inputs.dns_query]]
  domains = [{{ dns_domains|map('tojson')|join(', ') }}]
  servers = ["127.0.0.1"]

  [inputs.dns_query.tags]
    influxdb_db = "ping-metrics"
{%- endif %}
"""

SENSORS_TEMPLATE = """# Monitor sensors (requires lm-sensors package)
{% if sensors_available -%}
[[inputs.sensors]]
  [inputs.sensors.tags]
    influxdb_db = "os-metrics"
{%- endif %}
"""


def generate_prometheus_config():
    """Read UCI config and render Prometheus client output section."""
    e_uci = EUci()
    
    try:
        enabled = e_uci.get('telegraf', 'output_prometheus', 'enabled', dtype=str, default='0')
        listen_addr = e_uci.get('telegraf', 'output_prometheus', 'listen_addr', dtype=str, default=':9273')
        basic_auth_username = e_uci.get('telegraf', 'output_prometheus', 'basic_auth_username', dtype=str, default='')
        basic_auth_password = e_uci.get('telegraf', 'output_prometheus', 'basic_auth_password', dtype=str, default='')
    except Exception as e:
        print(f"Error reading UCI config: {e}")
        return False
    
    # Render template
    template = Environment(loader=BaseLoader()).from_string(PROMETHEUS_TEMPLATE)
    rendered = template.render(
        enabled=enabled,
        listen_addr=listen_addr,
        basic_auth_username=basic_auth_username,
        basic_auth_password=basic_auth_password
    )
    
    # Write to drop-in directory
    config_file = '/etc/telegraf.conf.d/prometheus.conf'
    os.makedirs(os.path.dirname(config_file), exist_ok=True)
    
    try:
        with open(config_file, 'w') as f:
            f.write(rendered)
        return True
    except Exception as e:
        print(f"Error writing config file: {e}")
        return False


def generate_ping_config():
    """Read UCI config and render ping input section."""
    e_uci = EUci()
    try:
        pings = e_uci.get('telegraf', 'internet', 'pings', dtype=str, list=True, default=[])
    except Exception:
        pings = []

    template = Environment(loader=BaseLoader()).from_string(PING_TEMPLATE)
    rendered = template.render(pings=pings)

    config_file = '/etc/telegraf.conf.d/ping.conf'
    os.makedirs(os.path.dirname(config_file), exist_ok=True)

    try:
        with open(config_file, 'w') as f:
            f.write(rendered)
        return True
    except Exception as e:
        print(f"Error writing config file: {e}")
        return False


def generate_dns_config():
    """Read UCI config and render DNS query input section."""
    e_uci = EUci()
    try:
        dns_domains = e_uci.get('telegraf', 'internet', 'dns', dtype=str, list=True, default=[])
    except Exception:
        dns_domains = []

    template = Environment(loader=BaseLoader()).from_string(DNS_TEMPLATE)
    rendered = template.render(dns_domains=dns_domains)

    config_file = '/etc/telegraf.conf.d/dns.conf'
    os.makedirs(os.path.dirname(config_file), exist_ok=True)

    try:
        with open(config_file, 'w') as f:
            f.write(rendered)
        return True
    except Exception as e:
        print(f"Error writing config file: {e}")
        return False


def sensors_available():
    """Check if sensors command works by running it with -A -u flags."""
    try:
        result = subprocess.run(['sensors', '-A', '-u'], capture_output=True, timeout=5)
        return result.returncode == 0
    except (subprocess.TimeoutExpired, FileNotFoundError):
        return False


def generate_sensors_config():
    """Render sensors input section based on system availability."""
    has_sensors = sensors_available()
    
    # Render template
    template = Environment(loader=BaseLoader()).from_string(SENSORS_TEMPLATE)
    rendered = template.render(sensors_available=has_sensors)
    
    # Write to drop-in directory
    config_file = '/etc/telegraf.conf.d/sensors.conf'
    os.makedirs(os.path.dirname(config_file), exist_ok=True)
    
    try:
        with open(config_file, 'w') as f:
            f.write(rendered)
        return True
    except Exception as e:
        print(f"Error writing config file: {e}")
        return False


if __name__ == '__main__':
    generate_prometheus_config()
    generate_sensors_config()
    generate_ping_config()
    generate_dns_config()
    exit(0)
