import maya.cmds as cmds
import base64
import zlib
import urllib.request as urllib2
from urllib.error import HTTPError, URLError

def create_menu():
    import maya.mel as mel
    gMainWindow = mel.eval('$tmp = $gMainWindow;')
    
    menu_name = "TriArtPipelineMenu"
    if cmds.menu(menu_name, exists=True):
        cmds.deleteUI(menu_name)
        
    custom_menu = cmds.menu(menu_name, parent=gMainWindow, tearOff=True, label="TriArt Pipeline")
    cmds.menuItem(parent=custom_menu, label="TriArt Mocap Baker", command="import hik_automator_ui; hik_automator_ui.show()")
    
    cmds.menuItem(parent=custom_menu, divider=True)
    modeling_menu = cmds.menuItem(parent=custom_menu, subMenu=True, tearOff=True, label="Modeling")
    cmds.menuItem(parent=modeling_menu, label="Asset Bake Exporter", command="import assetBakeExporter; assetBakeExporter.show()")
    cmds.menuItem(parent=modeling_menu, label="UV Bake Offset Tool", command="import uvBakeOffsetTool; uvBakeOffsetTool.show()")
    
    cmds.menuItem(parent=custom_menu, divider=True)
    cmds.menuItem(parent=custom_menu, label="Cambiar Licencia...", command="import hik_automator_ui; hik_automator_ui.clear_token()")

def clear_token():
    if cmds.optionVar(exists="triart_mocap_token"):
        cmds.optionVar(remove="triart_mocap_token")
    cmds.confirmDialog(title="Licencia borrada", message="La licencia actual ha sido eliminada.\nVuelve a abrir la herramienta para ingresar una nueva.", button=["OK"])

def get_token():
    if cmds.optionVar(exists="triart_mocap_token"):
        return cmds.optionVar(query="triart_mocap_token")
    return None

def prompt_for_token():
    result = cmds.promptDialog(
        title='Licencia Requerida',
        message='Ingresa tu Token de Licencia de TriArt:',
        button=['Validar', 'Cancelar'],
        defaultButton='Validar',
        cancelButton='Cancelar',
        dismissString='Cancelar')
        
    if result == 'Validar':
        token = cmds.promptDialog(query=True, text=True)
        if token:
            cmds.optionVar(stringValue=("triart_mocap_token", token))
            return token
    return None

def show():
    token = get_token()
    if not token:
        token = prompt_for_token()
        
    if not token:
        return
        
    # Conectando con Google Cloud Run (Producción)
    SERVER_URL = "https://maya-auth-server-326958888696.us-central1.run.app/api/v1/download_tool" 
    
    req = urllib2.Request(SERVER_URL)
    req.add_header('Authorization', 'Bearer ' + token)
    
    try:
        response = urllib2.urlopen(req, timeout=30)
        payload = response.read()
    except HTTPError as e:
        if e.code == 401 or e.code == 403:
            cmds.confirmDialog(title="Licencia Inválida", message="El token ingresado no es válido o fue revocado.", button=["OK"])
            # Borramos el token malo para que vuelva a preguntar la próxima vez
            if cmds.optionVar(exists="triart_mocap_token"):
                cmds.optionVar(remove="triart_mocap_token")
        else:
            cmds.confirmDialog(title="Error", message="Error interno del servidor de licencias.", button=["OK"])
        return
    except URLError as e:
        cmds.confirmDialog(title="Error de Red", message="No se pudo contactar con el servidor. Verifica tu conexión a internet.", button=["OK"])
        return
    except Exception as e:
        cmds.confirmDialog(title='Error', message='Ha ocurrido un error inesperado: ' + str(e), button=['OK'])
        if cmds.optionVar(exists='triart_mocap_token'):
            cmds.optionVar(rm='triart_mocap_token')
        return
        
    try:
        # Desencriptar
        compressed_data = base64.b64decode(payload)
        code_str = zlib.decompress(compressed_data).decode('utf-8')
        
        # Ejecutar en un entorno aislado para no sobreescribir el loader
        payload_namespace = {}
        exec(code_str, payload_namespace)
        
        # Arrancar la ventana
        if 'HIKAutomatorUI' in payload_namespace:
            payload_namespace['HIKAutomatorUI']()
        
    except Exception as e:
        cmds.confirmDialog(title="Error Fatal", message="No se pudo inicializar la herramienta remota.\n" + str(e), button=["OK"])
