#!/usr/bin/python3
from typing import List
from urllib.parse import urljoin
import argparse
import json
import os
import requests
import sys
import xml.etree.ElementTree as xml

def refresh_radarr_library(base_url: str, api_key: str) -> None:
    requests.post(
        urljoin(f"{base_url}/", "api/v3/command"),
        params={
            "apiKey": api_key,
        },
        headers={
            "Content-Type": "application/json",
        },
        data=json.dumps({
            "name": "RefreshMovie",
        }),
    ).raise_for_status()


def refresh_sonarr_library(base_url: str, api_key: str) -> None:
    requests.post(
        urljoin(f"{base_url}/", "api/command"),
        params={
            "apikey": api_key,
        },
        headers={
            "Content-Type": "application/json",
        },
        data=json.dumps({
            "name": "RefreshSeries",
        }),
    ).raise_for_status()


class PlexClient:
    def __init__(self, plex_base_url: str, plex_token: str):
        self.__plex_base_url = plex_base_url
        self.__plex_token = plex_token


    def __create_plex_request(self, relative_path: str) -> str:
        response = requests.get(
            urljoin(f"{self.__plex_base_url}/", relative_path),
            timeout=3,
            headers={
                "X-Plex-Token": self.__plex_token,
            },
        )

        response.raise_for_status()

        return response.text


    def get_plex_library_sections(self) -> List[str]:
        sections = xml.fromstring(self.__create_plex_request("library/sections"))

        return [section.attrib["key"] for section in sections]


    def refresh_plex_library_section(self, section_id: str) -> None:
        self.__create_plex_request(f"library/sections/{section_id}/refresh")


    def refresh_all_plex_libraries(self) -> None:
        for section_id in self.get_plex_library_sections():
            self.refresh_plex_library_section(section_id)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description="Radarr, Sonarr, & Plex library refresher",
        epilog="All arguments will also fallback to environment variable settings of their name in capitalized snake case if not set. For example: if --plex-token isn't set, it will try to read the PLEX_TOKEN environment variable value",
    )

    parser.add_argument("--plex-base-url", type=str, nargs="?", default=os.getenv("PLEX_BASE_URL"), metavar="http://example.com:32400")
    parser.add_argument("--plex-token", type=str, nargs="?", default=os.getenv("PLEX_TOKEN"), metavar="Z99EuQ9Xy9G9z9PQFl99")
    parser.add_argument("--sonarr-base-url", type=str, nargs="?", default=os.getenv("SONARR_BASE_URL"), metavar="http://example.com/sonarr")
    parser.add_argument("--sonarr-api-key", type=str, nargs="?", default=os.getenv("SONARR_API_KEY"), metavar="6ce909a20a634f7cbe245e1893865ee5")
    parser.add_argument("--radarr-base-url", type=str, nargs="?", default=os.getenv("RADARR_BASE_URL"), metavar="http://example.com/radarr")
    parser.add_argument("--radarr-api-key", type=str, nargs="?", default=os.getenv("RADARR_API_KEY"), metavar="7ce909a20a634f7cbe245e1893865ee8")

    args = parser.parse_args()

    print_help = True

    if bool(args.plex_base_url) != bool(args.plex_token):
        print("if refreshing Plex, both the base url & token must be set", file=sys.stderr)
        sys.exit(1)

    if bool(args.sonarr_base_url) != bool(args.sonarr_api_key):
        print("if refreshing sonarr, both the base url & API key must be set", file=sys.stderr)
        sys.exit(2)

    if bool(args.radarr_base_url) != bool(args.radarr_api_key):
        print("if refreshing radarr, both the base url & API key must be set", file=sys.stderr)
        sys.exit(3)

    if args.plex_base_url:
        print_help = False
        print(f"refreshing all Plex libraries at {args.plex_base_url}")
        PlexClient(args.plex_base_url, args.plex_token).refresh_all_plex_libraries()
        print(f"successfully initiated a refresh of all Plex libraries at {args.plex_base_url}")

    if args.sonarr_base_url:
        print_help = False
        print(f"refreshing sonarr library at {args.sonarr_base_url}")
        refresh_sonarr_library(args.sonarr_base_url, args.sonarr_api_key)
        print(f"successfully initiated a refresh for the sonarr library at {args.sonarr_base_url}")

    if args.radarr_base_url:
        print_help = False
        print(f"refreshing radarr library at {args.radarr_base_url}")
        refresh_radarr_library(args.radarr_base_url, args.radarr_api_key)
        print(f"successfully initiated a refresh for the radarr library at {args.radarr_base_url}")

    if print_help:
        parser.print_help()
        sys.exit(-1)