#!/usr/bin/python3.10
# -*- coding: utf-8 -*-

import getpass # pour cacher le mdp
import subprocess
import argparse # pour les options
import sys
from xmlrpc.client import Server
from xmlrpc import client as xmlrpclib # ligne à rajouter


def getserveur(user_zephir,mdp_user,serveur_address):
    class SpecialTransport(xmlrpclib.SafeTransport):
        def send_content(self, connection, request_body):
            connection.putheader("Referer", f"https://serveur_address:7080")  # URL dynamique du zephir
            connection.putheader("Origin", f"https://serveur_address:7080")  # URL dynamique du zephir
            connection.putheader("X-Requested-With", "XMLHttpRequest")
            connection.putheader("Content-Type", "text/xml")
            connection.putheader("Content-Length", str(len(request_body)))
            connection.endheaders()
            if request_body:
                connection.send(request_body)
    z = Server(f"https://{user_zephir}:{mdp_user}@{serveur_address}:7080",  # URL dynamique pour la connexion
               transport=SpecialTransport(),  # Appel de la classe de surcharge transport
               verbose=False,  # ligne à rajouter
               allow_none=True)  # ligne à rajouter
    return z


def add(args):
    # Ajouter ici le code pour ajouter l'archive
    print(f"Association effectué avec ID Zephir : {args.id_zephir} et l'UAI : {args.uai}")
    uai_file = f"{args.uai}.tar.gz"
    z = getserveur(args.user_zephir,args.mdp_user,args.serveur_address)
    a = z.aaf.add_file(args.id_zephir,args.uai)
    print(a)

def associate(args):
    # Ajouter ici le code pour ajouter l'archive
    print(f"Ajout effectué avec ID Zephir : {args.id_zephir} et UAI : {args.uai}")
    print(f"Attention, aucune notification effecutée, faire un --notify lorsqu'attendu")

def delete(args):
    # Ajouter ici le code pour ajouter l'archive
    print(f"Suppression de l'archive aaf : {args.uai}.tar.gz")
    # Surcharge des headers pour le transport
    uai_file = f"{args.uai}.tar.gz"
    z = getserveur(args.user_zephir,args.mdp_user,args.serveur_address)
    d = z.aaf.del_file(uai_file)
    print(d)


def getlist(args):
    print(f"Listing des archives pour l'ID Zephir : {args.id_zephir}")
    # Surcharge des headers pour le transport
    z = getserveur(args.user_zephir,args.mdp_user,args.serveur_address)
    g = z.aaf.get_list(args.id_zephir)
    print(g)


def notify(args):
    print(f"Synchonisation avec la base zephir : {args.user_zephir}@{args.serveur_address}")
    # Surcharge des headers pour le transport
    z = getserveur(args.user_zephir,args.mdp_user,args.serveur_address)

    uai_file = f"{args.uai}.tar.gz"
    if args.annual == True:
        a = z.aaf.notify_upload_annual(uai_file)
    else:
        a = z.aaf.notify_upload(uai_file)
    print(a)

# Fonction pour gérer les options avec argparse
if __name__ == "__main__":

    parser = argparse.ArgumentParser(description="Outil de gestion archive AAF Zephir")
    # Option associate
    subparsers = parser.add_subparsers(help='sub-command')

    add_subparser = subparsers.add_parser("add", help="Ajout d'une archive aaf au format tar.gz dans la base zephir, sans prise en compte pour action")
    add_subparser.set_defaults(func=add)
    add_subparser.add_argument('--serveur_address', type=str, required=True, help="Adresse du serveur zephir, format fqdn")
    add_subparser.add_argument('--user_zephir', type=str, required=True, help="Nom de l'utilisateur Zephir à utiliser (droit nécessaire)")
    add_subparser.add_argument('--mdp_user', type=str, required=True, help="Mot de passe pour l'utilisateur Zephir")
    add_subparser.add_argument('--id_zephir', type=int, required=True)
    add_subparser.add_argument('--uai', type=str, required=True, help="Numéro UAI et nom de l'archive.(ancien RNE)")

    associate_subparser = subparsers.add_parser("associate", help="Ajout/copie d'une archive aaf au format tar.gz, avec prise en compte par zephir pour action")
    associate_subparser.set_defaults(func=associate)
    associate_subparser.add_argument('--serveur_address', type=str, required=True, help="Adresse du serveur zephir, format fqdn")
    associate_subparser.add_argument('--user_zephir', type=str, required=True, help="Nom de l'utilisateur Zephir à utiliser (droit nécessaire)")
    associate_subparser.add_argument('--mdp_user', type=str, required=True, help="Mot de passe pour l'utilisateur Zephir")
    associate_subparser.add_argument('--id_zephir', type=int, required=True, help="Numéro identifiant le serveur cible sur zephir (enregistmrent_zephir)")
    associate_subparser.add_argument('--uai', type=str, required=True, help="Numéro UAI et nom de l'archive.(ancien RNE)")

    delete_subparser = subparsers.add_parser("delete", help="Suppression d'une archive de la base zephir")
    delete_subparser.set_defaults(func=delete)
    delete_subparser.add_argument('--serveur_address', type=str, required=True, help="Adresse du serveur zephir, format fqdn")
    delete_subparser.add_argument('--user_zephir', type=str, required=True, help="Nom de l'utilisateur Zephir à utiliser (droit nécessaire)")
    delete_subparser.add_argument('--mdp_user', type=str, required=True, help="Mot de passe pour l'utilisateur Zephir")
    delete_subparser.add_argument('--uai', type=str, required=True, help="Numéro UAI et nom de l'archive.(ancien RNE)")

    getlist_subparser = subparsers.add_parser("getlist", help="Liste les archives associées à l'id du serveur indiqué")
    getlist_subparser.set_defaults(func=getlist)
    getlist_subparser.add_argument('--serveur_address', type=str, required=True, help="Adresse du serveur zephir, format fqdn")
    getlist_subparser.add_argument('--user_zephir', type=str, required=True, help="Nom de l'utilisateur Zephir à utiliser (droit nécessaire)")
    getlist_subparser.add_argument('--mdp_user', type=str, required=True, help="Mot de passe pour l'utilisateur Zephir")
    getlist_subparser.add_argument('--id_zephir', type=int, required=True, help="Numéro identifiant le serveur cible sur zephir (enregistmrent_zephir)")

    notify_subparser = subparsers.add_parser("notify", help="Ajout/copie d'une archive aaf au format tar.gz dans la base zephir, avec prise en compte pour action")
    notify_subparser.set_defaults(func=notify)
    notify_subparser.add_argument('--serveur_address', type=str, required=True, help="Adresse du serveur zephir, format fqdn")
    notify_subparser.add_argument('--user_zephir', type=str, required=True, help="Nom de l'utilisateur Zephir à utiliser (droit nécessaire)")
    notify_subparser.add_argument('--mdp_user', type=str, required=True, help="Mot de passe pour l'utilisateur Zephir")
    notify_subparser.add_argument('--uai', type=str, required=True, help="Numéro UAI et nom de l'archive.(ancien RNE)")
    notify_subparser.add_argument('--annual', action="store_true")

    # Analyser les arguments
    args = parser.parse_args()
    args.func(args)
