#!/bin/env python3
#

import json
import re
import subprocess

from typing import Any

CPU_REGEX = re.compile(r'(core|k\d+)temp', re.IGNORECASE)
NON_TEMP_REGEX = re.compile(r'^(fan|in|curr)', re.IGNORECASE)

def get_data() -> dict[Any, Any]:
  cmd = ('sensors', '-j')
  data = {}
  raw_data = []

  try:
    proc = subprocess.run(
      args=cmd,
      stdout=subprocess.PIPE,
      stderr=subprocess.PIPE,
      encoding='utf-8',
      check=True,
      )
  except subprocess.CalledProcessError:
    return data

  for line in proc.stdout.splitlines():
    if line.strip() == ',':
      # Assuming malformatted line caused by missing data
      continue
    raw_data.append(line)

  try:
    data = json.loads('\n'.join(raw_data))
  except json.JSONDecodeError:
    # Still broken, just return the empty dict
    pass

  return data

def get_max_temp(data) -> str:
  cpu_temps = []
  max_cpu_temp = '??° C'
  for adapter, sources in data.items():
    if not CPU_REGEX.search(adapter):
      continue
    sources.pop('Adapter', None)

    for labels in sources.values():
      for label, temp in sorted(labels.items()):
        if 'input' not in label or NON_TEMP_REGEX.search(label):
          continue
        cpu_temps.append(temp)

  # Format data
  if cpu_temps:
    max_cpu_temp = int(max(cpu_temps))
    max_cpu_temp = f'{max_cpu_temp:02d}° C'

  # Done
  return max_cpu_temp

if __name__ == '__main__':
  sensor_data = get_data()
  print(get_max_temp(sensor_data))
