import json
import os
import sys
import requests
from typing import Optional

METADATA_FILENAME = "surfer.json"
TAGS_API_URL = "https://hg.mozilla.org/releases/mozilla-release/json-tags"


def get_current_version() -> Optional[str]:
  """Retrieve the current version from the metadata file."""
  try:
    with open(METADATA_FILENAME) as f:
      metadata = json.load(f)
      return metadata["version"]["candidate"]
  except (FileNotFoundError, json.JSONDecodeError) as e:
    print(f"Error reading current version: {e}")
    return None


def get_repo_data() -> Optional[str]:
  """Retrieve the repository data from the API."""
  try:
    print(f"Retrieving repository data from {TAGS_API_URL}")
    response = requests.get(TAGS_API_URL)
    response.raise_for_status()  # Raise an error for bad responses
    return response.json()
  except requests.RequestException as e:
    print(f"Error retrieving repository data: {e}")
    return None


def get_rc_response() -> Optional[str]:
  """Get the release candidate response from the response file."""
  try:
    data = get_repo_data()
    for tag_dict in data["tags"]:
      tag = tag_dict["tag"]
      if (tag.startswith("FIREFOX") and tag.endswith("_BUILD1")
              and "ESR" not in tag and "b" not in tag and "ANDROID" not in tag):
        return (tag.replace("FIREFOX_", "").replace("_BUILD1",
                                                    "").replace("_", "."))
  except (FileNotFoundError, json.JSONDecodeError) as e:
    print(f"Error reading RC response: {e}")
  return None


def get_pings() -> str:
  """Build a string of Discord user IDs for mentions."""
  ping_ids = os.getenv("DISCORD_PING_IDS", "")
  return " ".join(f"<@{ping.strip()}>" for ping in ping_ids.split(",")
                  if ping.strip())


def send_webhook(rc: str) -> None:
  """Send a message to the Discord webhook."""
  text = f"||{get_pings()}|| New Firefox RC version is available: **{rc}**"
  webhook_url = os.getenv("DISCORD_WEBHOOK_URL")

  if webhook_url:
    message = {
        "content": text,
        "username": "Firefox RC Checker",
    }
    try:
      response = requests.post(webhook_url, json=message)
      response.raise_for_status()  # Raise an error for bad responses
    except requests.RequestException as e:
      print(f"Error sending webhook: {e}")
  else:
    print("Webhook URL not set.")


def rc_should_be_updated(rc_response: str, current_version: str) -> bool:
  return rc_response and rc_response != current_version


def main() -> int:
  current_version = get_current_version()
  rc_response = get_rc_response()

  if rc_should_be_updated(rc_response, current_version):
    send_webhook(rc_response)
    return 0

  print(f"Current version: {current_version}, RC version: {rc_response}")
  return 0


if __name__ == "__main__":
  sys.exit(main())
