
    NiJ              
           d Z ddlmZmZ ddlmZmZ ddlmZ ddl	m
Z
 ddlmZmZ deded	d
fdZdedededed	d
f
dZdeded	efdZdeded	ed
z  fdZded	d
fdZd
S )z
Plugin Router - Dynamic API endpoints for plugins

Automatically generates routes for all discovered plugins and handles:
- Request parameter extraction and validation
- Plugin execution
- Error handling and responses
    )AnyCallable)jsonifyrequest)require_api_key)get_plugin_registry)validate_plugin_paramsapply_default_values
url_prefixbrowser_navigator_getterreturnNc                 J   t                      }|                                }|st          d           dS t          d           |                                D ]\  }}t	          || |||           t          ||            t          dt          |           d           dS )aW  
    Register dynamic HTTP routes for all discovered plugins.
    
    Each plugin gets an endpoint at: {url_prefix}/<page_id>/plugin/<plugin-name>
    
    Args:
        url_prefix: API version prefix (e.g., "/api/v1")
        app: Quart app instance
        browser_navigator_getter: Function that returns the browser_navigator instance
    uA   ⚠️  No plugins registered, skipping plugin route registrationNu"   
📡 Registering plugin routes...)appr   plugin_nameplugin_instancer   u   ✅ Registered z plugin route(s)
)r   list_pluginsprintitems_register_plugin_route_register_metadata_endpointlen)r   r   r   registrypluginsr   r   s          3/home/byschii/byschiidev/penelope/routers/plugin.pyregister_plugin_routesr      s     #$$H##%%G QRRR	
0111(/ 
 
$_!#+%=	
 	
 	
 	
 	
  Z000	
<CLL
<
<
<=====    r   r   c                    | d }|j         j        pdg}fd} ||          }d                    dd           |_        |                     |||           t          dd	                    |          d
d|            dS )a!  
    Register a single plugin route.
    
    Args:
        app: Quart app instance
        url_prefix: API version prefix
        plugin_name: Plugin name from metadata
        plugin_instance: Plugin instance
        browser_navigator_getter: Function that returns browser_navigator
    z/<page_id>/plugin/POSTc                 B     t           dt          f fd            }|S )Npage_idc                   K   	              }|st          ddd          dfS t          j                     d{V pi }t          	|          }t	          	|d          \  }}|st          d|d          dfS 	                    || |           d{V }d|vrd	|d<   t          |          S # t          $ r,}t          dt          |          
d
          dfcY d}~S d}~ww xY w)z
            Handle plugin execution request.
            
            Args:
                page_id: Page identifier from URL path
                
            Returns:
                JSON response with plugin execution results
            FzBrowser not initializedsuccesserror  Ndetailedi  r#   T)r#   r$   plugin)r   r   get_jsonr
   r	   execute	Exceptionstr)r    browser_navigatordataparamsis_validr$   resulter   r(   r   s           r   handlerz=_register_plugin_route.<locals>.make_handler.<locals>.handlerK   s     %$<$<$>$>!( "#(!:$ $     %-////////52 .fd;; #9RW"X"X"X% "#(!&$ $      &~~.?&QQQQQQQQ F**(,F9%v&   $ VV)      	      s)   B0 AB0 ;4B0 0
C&:!C!C&!C&)r   r,   )r(   r3   r   r   s   ` r   make_handlerz,_register_plugin_route.<locals>.make_handlerJ   sE    	/	3 /	 /	 /	 /	 /	 /	 /	 
/	b r   plugin_-_)	view_funcmethodsz   /8 N)metadatar9   replace__name__add_url_ruler   join)	r   r   r   r   r   
route_pathr9   r4   handler_funcs	     ` `    r   r   r   5   s    " ??+??J&.:6(G3 3 3 3 3 3l  <00LEk&9&9#s&C&CEEL     

2!!
2
2
2j
2
233333r   r(   r/   c                 &    ddl m}  || |          S )z
    DEPRECATED: Use lib.plugin_validator.apply_default_values instead.
    Apply default values from plugin parameter schema.
    r   )r
   )lib.plugin_validatorr
   )r(   r/   r
   s      r   _apply_defaultsrF      s)    
 :99999///r   c                 <    ddl m}  || |d          \  }}|rdn|S )z
    DEPRECATED: Use lib.plugin_validator.validate_plugin_params instead.
    Validate request parameters against plugin schema.
    r   )r	   Fr&   N)rE   r	   )r(   r/   r	   r0   r$   s        r   _validate_paramsrH      s@    
 <;;;;;,,VVeLLLOHe&44&r   c                 v    | d}|                      |dg          d             }t          d|            dS )z
    Register endpoint that returns metadata for all plugins.
    
    Args:
        app: Quart app instance
        url_prefix: API version prefix
    z/pluginsGET)r9   c            	        K   	 t                      } |                                 }g }|                                D ]\\  }}|                    |j        j        |j        j        |j        j        |j        j        d |j        j	        D             d           ]t          dt          |          |d          S # t          $ r+}t          dt          |          d          dfcY d}~S d}~ww xY w)	z
        Get metadata for all registered plugins.
        
        Returns:
            JSON with plugin list and their schemas
        c                     g | ]>}|j         |j        |j        |j        |j        |j        |j        r|j        ng |j        d ?S )nametypelabelrequireddefaultplaceholderoptions	help_textrM   ).0ps     r   
<listcomp>zM_register_metadata_endpoint.<locals>.get_plugins_metadata.<locals>.<listcomp>   sd     # # #  %&F$%F%&W()
'(y+,=45I'Eqyy2)*	 	# # #r   )rN   descriptionr9   bg_color
parametersT)r#   countr   Fr"   r%   N)r   r   r   appendr=   rN   rY   r9   rZ   r[   r   r   r+   r,   )r   r   plugins_configrN   r(   r2   s         r   get_plugins_metadataz9_register_metadata_endpoint.<locals>.get_plugins_metadata   sL     $	*,,H++--GN '  f%%"O0#)?#>%6 & 8# # "(!;# # #' '    ( ^,,)      	 	 	 Q          	s   B4B9 9
C. C)#C.)C.z   GET      N)router   )r   r   rB   r_   s       r   r   r      s^     (((JYYzE7Y+++ + ,++Z 

%
%
%&&&&&r   )__doc__typingr   r   quartr   r   lib.authr   lib.plugin_loaderr   rE   r	   r
   r,   r   r   dictrF   rH   r    r   r   <module>rh      sx    !               " " " " " " " " $ $ $ $ $ $ 1 1 1 1 1 1 M M M M M M M M >s  >8  >X\  >  >  >  >FT4T4 T4 	T4
 'T4 
T4 T4 T4 T4p0C 0 0$ 0 0 0 0'S '$ '3: ' ' ' '8' 8' 8' 8' 8' 8' 8' 8'r   