#!/usr/bin/python3
# lastact: arturo@2023-10-10
# desc: Manipulacion de archivos XML asociados a xfce4, ubicados en principio en el /etc/skel/.config/xfce4

# Para recoger los parametros pasados en la llamada al script:
import argparse
# Importamos textwrap para poder hacer uso de un epilogo de ejemplos al final de la ayuda de varias lineas, tal como indica la doc de argparse:
# https://docs.python.org/es/3/library/argparse.html
import textwrap
# Importamos sys para poder pasar los parámetros desde la función de inicio a la función main:
import sys
# Para manipular archivos XML:
import xml.etree.ElementTree as ET
# Para hacer llamadas al sistema:
import os

# Definir el epílogo con ejemplos:
epilogo = '''
Ejemplos de uso:
  Ejemplo 1: vx-xfconf-query /tmp/xfce4-panel.xml panels/panel-0/position g
  Ejemplo 2: vx-xfconf-query /tmp/xfce4-panel.xml panels/panel-0/position s --valor "p=1;x=8;y=78"
'''

def main(argv):
    # Crear un objeto ArgumentParser y agregar un argumento
    parser = argparse.ArgumentParser(
        description="Pasar al menos tres argumentos: ruta archivo, path xml y operacion a realizar", 
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog=textwrap.dedent(epilogo))
    parser.add_argument('archivo', help='Ruta del archivo XML')
    parser.add_argument('path_xml', help='Path XML del elemento a tratar')
    parser.add_argument('operacion', choices=['g', 's','a', 'r','u'], help='Operación a realizar: lectura/get(g), escritura/set(s), actualizar/update(u), añadir/add(a) o eliminar/remove(r)')
    parser.add_argument('--valor', help='Valor a asignar con la operación de escritura/set s', required=False)
    parser.add_argument('--param', help='Parámetro a añadir un atributo a un parámetro, actualizar el valor de un parámetro, o para su eliminación', required=False)
    args = parser.parse_args()

    if os.path.isfile(args.archivo):
        # Cargar el archivo XML
        tree = ET.parse(args.archivo)
        root = tree.getroot()

        # Acceder al elemento deseado y modificar su valor
        # Suponiendo que la ruta es: 'panels/panel-0/position', vamos a extraer las componentes:
        trozos=list(filter(bool,args.path_xml.split("/")))
        # Componemos el correcto path XML:
        # ruta_xml = "property[@name='panels']/property[@name='panel-0']/property[@name='position']"
        ruta_xml = ""
        for trozo in trozos:
            ruta_xml += f"property[@name='{trozo}']/"
        # Eliminamos la última / de la ruta_xml:
        ruta_xml = ruta_xml[:-1]
        # print(f"La ruta xml es {ruta_xml}")
        elemento = root.find(ruta_xml)
        if args.operacion == "g":
            print(f"{elemento.get('value')}")
        if args.operacion == "s":
            elemento.set('value',args.valor)
            # Guardar el archivo XML modificado
            tree.write(args.archivo)
        if args.operacion == "a" or args.operacion == "u":
            elemento.set(args.param,args.valor)
            tree.write(args.archivo)
        if args.operacion == "r":
            if args.param:
                del elemento.attrib[args.param]
                tree.write(args.archivo)
    else:
        # Si el archivo no existe, imprimir un mensaje de error
        print('El archivo XML no existe')

if __name__ == "__main__":
  main(sys.argv[1:])