#!/usr/bin/python3

import argparse
import os
import subprocess
import urllib.request
import configparser
import json
from packaging import version

parser = argparse.ArgumentParser(description='AWX-RPM management')
parser.add_argument(metavar='OPERATION',help="Choose either: install, update, upgrade or config",dest='operation',choices=["install","update","upgrade","config"])

args = parser.parse_args()

stream = os.popen("mv /etc/yum.repos.d/awx-rpm*.repo /etc/yum.repos.d/awx-rpm.repo")

command = str(args.operation)

f = open("/tmp/awx-rpm-manage.log", "a")

def rename_config_section(config, old_section, new_section):
    """Rename a section in a configparser object."""
    config._sections[new_section] = config._sections.pop(old_section)

def print_and_log(message):
    print(message)
    f.write(message+"\n")

def log(message):
    f.write(message+"\n")

if command == "install":
        print_and_log("Installation is not yet implemented")
elif command == "config":
        print_and_log("Configuration is not yet implemented")
elif command == "upgrade":
        print_and_log("Getting info on latest AWX-RPM Version")
        repo = configparser.ConfigParser()
        repo.read('/etc/yum.repos.d/awx-rpm.repo')
        repos = repo.sections()
        currentversion = repos[0].replace("awx-rpm-","")
        url = "https://api.github.com/repos/MrMEEE/awx-rpm-versions/branches"
        response = urllib.request.urlopen(url)
        data = json.load(response)
        updates = []
        for d in data:
            if d["name"] != "main" and version.parse(str(d["name"])) > version.parse(str(currentversion)):
                updates.append(d)
        if updates == []:
            print_and_log("No upgrades available")
            quit()

        print_and_log("You are currently on version: "+currentversion)
        print_and_log("")
        print_and_log("Available versions:")
        print_and_log("")
        i = 1
        for newversion in updates:
             print_and_log(str(i)+": "+newversion['name'])

        print_and_log("")
        print_and_log("Enter the number for the version to upgrade to")
        print_and_log("")
        input = int(input('Enter value: ').strip() or "42")
        log("Input was: "+input)
        upgrade = int(input) - 1
        try:
            print_and_log("Upgrading to version: "+updates[upgrade]['name'])
        except:
            print_and_log("Wrong input, try again")
            raise
        oldreponame = repos[0]
        newreponame = repos[0].replace(currentversion, updates[upgrade]['name'])
        newrepourl = repo.get(oldreponame,'baseurl').replace(currentversion, updates[upgrade]['name'])
        repo[oldreponame]['baseurl'] = newrepourl
        rename_config_section(repo, oldreponame, newreponame)

        print_and_log("Changing the repo to version: "+updates[upgrade]['name'])
        with open('/etc/yum.repos.d/awx-rpm.repo', 'w') as repofile:
                repo.write(repofile)

        stream = os.popen("/usr/bin/dnf clean all")
        log(stream.read())

        stream = os.popen("dnf check-update -b awx-rpm |grep awx-rpm | awk '{ print $2}' | awk '{$1=$1};1' | tr -d '\n' |sed \"s/repository//g\"")
        log(stream.read())
        newestversion = stream.read()
        
        print_and_log("Newest AWX-RPM Version available in repos is: "+newestversion)
        print_and_log("Getting lastest package excludelists")

        url = "https://rpm.awx.wiki/AWX-RPM/excludelists/awx-rpm-"+newestversion
        response = urllib.request.urlopen(url)
        data = response.read()
        excludepackages = data.decode('utf-8')
        excludeline = ""
        for each_line in excludepackages:
                package = each_line.replace("\n", ",").strip()
                excludeline = excludeline + package

        print_and_log("Setting excludelist for EPEL")
        repo = configparser.ConfigParser()
        repo.read('/etc/yum.repos.d/epel.repo')
        repo['epel']['exclude'] = excludeline
        with open('/etc/yum.repos.d/epel.repo', 'w') as repofile:
                repo.write(repofile)
        
        stream = os.popen("/usr/bin/dnf clean all")
        log(stream.read())

        if version.parse(str(currentversion)) < version.parse('24.1.0'):
                print_and_log("Doing workaround and cleanup for moving from Python3 to Python3.11")
                stream = os.popen("dnf -y remove awx-rpm")
                log(stream.read())
                print_and_log("Upgrading AWX-RPM")
                stream = os.popen("dnf -y install awx-rpm")
                log(stream.read())
        else:
                print_and_log("Upgrading AWX-RPM")
                stream = os.popen("dnf -y update awx-rpm")
                log(stream.read())

        print_and_log("Updating dependencies")
        stream = os.popen("dnf -y update")
        log(stream.read())

        print_and_log("Updating the AWX-RPM database")
        stream = os.popen("sudo -u awx awx-manage migrate")
        log(stream.read())

        print_and_log("Restarting AWX-RPM services")
        stream = os.popen("systemctl restart awx.target")
        log(stream.read())


elif command == "update":
        print_and_log("Getting info on latest AWX-RPM Updates")
        repo = configparser.ConfigParser()
        repo.read('/etc/yum.repos.d/awx-rpm.repo')
        repos = repo.sections()
        currentversion = repos[0].replace("awx-rpm-","")

        stream = os.popen("/usr/bin/dnf clean all")
        log(stream.read())

        stream = os.popen("dnf check-update -b awx-rpm |grep awx-rpm | awk '{ print $2}' | awk '{$1=$1};1' | tr -d '\n' |sed \"s/repository//g\"")
        newversion = stream.read()
        log(stream.read())

        if (newversion == ""):
                print_and_log("AWX-RPM is already updated to lastest, try awx-rpm-manage upgrade for major updates")
                quit()
        print_and_log("Newest AWX-RPM Version available in repos is: "+newversion)
        print_and_log("Getting lastest package excludelists")
        url = "https://rpm.awx.wiki/AWX-RPM/excludelists/awx-rpm-"+newversion
        response = urllib.request.urlopen(url)
        data = response.read()
        excludepackages = data.decode('utf-8')
        excludeline = ""
        for each_line in excludepackages:
                package = each_line.replace("\n", ",").strip()
                excludeline = excludeline + package
        
        log("Excludelist: "+excludeline)
        print_and_log("Setting excludelist for EPEL")
        repo = configparser.ConfigParser()
        repo.read('/etc/yum.repos.d/epel.repo')
        repo['epel']['exclude'] = excludeline
        with open('/etc/yum.repos.d/epel.repo', 'w') as repofile:
                repo.write(repofile)
        
        if os.path.isfile('/etc/yum.repos.d/_copr:copr.fedorainfracloud.org:group_copr:PyPI.repo'):
                repo = configparser.ConfigParser()
                repo.read('/etc/yum.repos.d/_copr:copr.fedorainfracloud.org:group_copr:PyPI.repo')
                if version.parse(str(currentversion)) < version.parse('24.1.0'):
                       print_and_log("Setting excludelist for PyPI")
                       repo['copr:copr.fedorainfracloud.org:group_copr:PyPI']['exclude'] = excludeline
                       with open('/etc/yum.repos.d/_copr:copr.fedorainfracloud.org:group_copr:PyPI.repo', 'w') as repofile:
                              repo.write(repofile)
                else:
                       os.remove('/etc/yum.repos.d/_copr:copr.fedorainfracloud.org:group_copr:PyPI.repo') 
        
        stream = os.popen("/usr/bin/dnf clean all")
        log(stream.read())
        print_and_log("Updating AWX-RPM")
        stream = os.popen("/usr/bin/dnf -y update awx-rpm")
        log(stream.read())
        print_and_log("Updating Dependencies")
        stream = os.popen("/usr/bin/dnf -y update")
        log(stream.read())

        print_and_log("Restarting AWX-RPM services")
        stream = os.popen("systemctl restart awx.target")
        log(stream.read())
f.close()
