
    fi!                        d Z ddlmZ ddlZddlmZ ddlmZmZm	Z	 dZ
dZ	 	 	 	 	 	 ddZ	 d	 	 	 	 	 	 	 	 	 	 	 	 	 dd	Ze
fdd
Ze
f	 	 	 	 	 	 	 	 	 ddZ	 	 d	 	 	 	 	 	 	 	 	 ddZy)z@Script discovery + selection helpers for Enter_PowerBi_Selector.    )annotationsN)Path)ListSequenceTuplezconfig/selector_defaults.jsonz.hide_in_selectorc                   | j                         } g }|j                  t        | j                  d                   |D ch c]1  }|j	                         s|j	                         j                         3 }}t        | j                         D cg c]  }|j                         s| c}      D ]t  }|j                  }|j                         |v r"|j                  d      r4|t        z  j                         rL|j                  t        |j                  d                   v t               }g }|D ]9  }	|	j                         }
|
|v r|j                  |
       |j                  |	       ; |S c c}w c c}w )z:Return *.py files in base_dir and exactly one level below.z*.py)._)resolveextendsortedglobstriploweriterdiris_dirname
startswithHIDE_FOLDER_MARKERexistssetaddappend)base_dirhide_foldersscriptsr   hiddendsubdirseenoutprps              %Powerbi_Background/Script_Selector.pyfind_py_scriptsr%      s;   
 !HGNN6(--/01/;Lttzz|djjl  "LFLX%5%5%7F188:!FG 4{{::<6!??:&''//1vfkk&1234 5DC YY[:

1 J' MFs    E3 E3E8%E8c                   | j                         } |j                         }| |z  j                         }t        | |      }|D ch c]1  }|j                         s|j                         j                         3 }	}|D 
cg c]1  }
|
j                         s|
j                         j                         3 }}
g }|D ]x  j                         ||hv rj                  j                         dk(  r6j                  j                         |	v rSt        fd|D              rh|j                         z |S c c}w c c}
w )z-Get scripts eligible for selection/execution.)r   z__init__.pyc              3  V   K   | ]   }|j                   j                         v  " y wN)r   r   ).0tss     r$   	<genexpr>z*get_displayable_scripts.<locals>.<genexpr>I   s      :qqAFFLLN":s   &))r   r%   r   r   r   anyr   )r   	this_filehide_script_nameshide_script_name_containsr   open_powerbi_filenameopen_powerbir   n
hide_exactr*   hide_containsfilteredr+   s                @r$   get_displayable_scriptsr7   /   s    !H!!#I44==?Lh\BG->L!'')!'')//#LJL0IW1QWWYQWWY__&WMWH 	99;9l3366<<>]*66<<>Z':M::	 O MWs   D; D;E  E c                   | j                         |z  j                         }	 t        j                  |j                  d            }|j	                  d      xs g D cg c]5  }t        |      j                         st        |      j                         7 }}t        |j	                  dd            }||fS c c}w # t        $ r g dfcY S w xY w)zELoad saved selected script paths (repo-relative) + keep_open setting.utf-8encodingselected_scriptskeep_powerbi_openF)	r   jsonloads	read_textgetstrr   bool	Exception)r   filenamepathdataxrel	keep_opens          r$   load_saved_selectionrK   O   s    )224Dzz$..'.:;(,1C(D(J^!sSTv||~s1v||~^^"5u=>	I~ _  5ys)   <B? B:>B: B? :B? ?CCc                p   | j                         } | |z  j                         }|j                  j                  dd       |D cg c]/  }|j                         j                  |       j	                         1 }}|t        |      d}|j                  t        j                  |d      d       |S c c}w )z=Persist selected scripts (repo-relative) + keep_open setting.T)parentsexist_ok)r<   r=      )indentr9   r:   )	r   parentmkdirrelative_toas_posixrC   
write_textr>   dumps)r   r<   rJ   rE   rF   r"   	rel_pathspayloads           r$   save_selectionrY   [   s     !Hx((*DKKdT2GWX!((2;;=XIX%!)_G 	OODJJwq1GODK Ys   4B3c           	     ~	   	 ddl ddl m} t	        |xs g       }| j                         } t        |      }j                         j                  d       j                  dd       g dj                  t        |      	      }j                        }|j                  j                  d
       j                  |d      j!                  |dj"                        }	j                        }
|
j%                  dfd       j'                  d|
d       j)                  |	j                         j                  dj                  d       |	j                  dj*                         g dBfddCfddCfd|s)j-                  |
ddd      j                  ddd       n+|D ]%  }|j/                  |       j1                         }||v }j                  |	      }j                  |
      }j3                  |||       j                  dd!       j                  |      }|j                  ddj4                  "       j7                  |d#d$|ffd%	&      j                  dd'(       j7                  |d)d$|ffd*	&      j                  d+       |j                  ddd$j4                  ,       j9                  |||f       ( j                        }|j                  j4                  dd-       j-                  |d.dd/      j                  d0       j3                  |d1|       j                  dd23       j                  |      }|j                  j4                  d45       dDfd6dBfd7}dBfd8}j7                  |d9fd:;      j                  j:                  +       j7                  |d<fd=;      j                  j:                  d>(       j7                  |d?|;      j                  j<                  +       j7                  |d@|;      j                  j<                  dA(       j?                          t        |jA                               t              fS # t        $ r}t        d      |d}~ww xY w)Ez,Interactive GUI to select and order scripts.r   N)
messageboxzwtkinter is required for the GUI. On Ubuntu/Mint: sudo apt install python3-tk
(or run with --headless to avoid the GUI).z"PowerBI: Configure default scriptsi  i  T)value)fillexpand)borderwidthvertical)orientcommandz<Configure>c                F    j                  j                  d            S )Nall)scrollregion)	configurebbox)_ecanvass    r$   <lambda>z$choose_scripts_gui.<locals>.<lambda>   s    6##U1C#D     )r   r   nw)windowanchor)yscrollcommandleft)sider]   r^   right)rq   r]   c                     D ]  \  } }}| j                           D ]%  \  } }}| j                  dddj                         ' y )Nw
   rO   rn   padxpadyr]   )pack_forgetpackX)framer
   	row_itemstks     r$   refresh_orderz)choose_scripts_gui.<locals>.refresh_order   sQ    $ 	 KE1a	 $ 	?KE1aJJcJ>	?rk   c                     t         fdt              D        d      }|dkD  r|   |dz
     c|dz
  <   |<            y y )Nc              3  :   K   | ]  \  }\  }}}|u s|  y wr(    r)   ifrmr
   	frame_objs       r$   r,   z6choose_scripts_gui.<locals>.move_up.<locals>.<genexpr>   "     U.![c1aC9DTAU   r      )next	enumerater   idxr   r}   s   ` r$   move_upz#choose_scripts_gui.<locals>.move_up   sS    UIi,@UWYZ71:33QR7AS.IcAg	#O rk   c                     t         fdt              D        d      }d|cxk  rt              dz
  k  r"n y |   |dz      c|dz   <   |<            y y )Nc              3  :   K   | ]  \  }\  }}}|u s|  y wr(   r   r   s       r$   r,   z8choose_scripts_gui.<locals>.move_down.<locals>.<genexpr>   r   r   r   r   r   )r   r   lenr   s   ` r$   	move_downz%choose_scripts_gui.<locals>.move_down   sb    UIi,@UWYZ(c)nq((1:33QR7AS.IcAg	#O )rk   z>No other .py scripts found in this folder (or one level down).rt   )textrn   justifyru   )rn   rw   rx   )r   variable)rq   rn   )rq   r^   r]   u   ↑rO   c                     |       S r(   r   )r|   r   s    r$   rj   z$choose_scripts_gui.<locals>.<lambda>   s    'RW. rk   )r   widthrb   )rO   r   )rq   rw   u   ↓c                     |       S r(   r   )r|   r   s    r$   rj   z$choose_scripts_gui.<locals>.<lambda>   s    )TYJZ rk   )rq   rv   )r]   rw   rx   aS  This screen configures your default script list.
After saving, normal runs use these defaults automatically.

Flow:
  1) Start Open_PowerBi.py
  2) Wait for powerbi_session.json + reachable geckodriver port
  3) Run selected scripts one-by-one in the order shown above
  4) Close Open_PowerBi + Firefox when done (unless you keep it open)
)r   r   rn   )rn   z Keep Power BI open when finished)   r   )rn   rx   )ru   r   )r]   rx   c                >    D ]  \  }}}|j                  |         y r(   )r   )valr
   varr}   s      r$   
select_allz&choose_scripts_gui.<locals>.select_all   s#    " 	IAsAGGCL	rk   c            	         D  cg c]"  \  } }}t        |j                               s!|$ c}}} dj                          y c c}}} w NF)rC   rA   destroy)r
   r   rF   	cancelledrootr}   selecteds      r$   on_runz"choose_scripts_gui.<locals>.on_run   s<    -6JJ\QT$swwy/DJ	 Ks
   "AAc                 J    j                          d j                          y NT)clearr   )r   r   r   s   r$   	on_cancelz%choose_scripts_gui.<locals>.on_cancel   s    	rk   z
Select Allc                       d      S r   r   r   s   r$   rj   z$choose_scripts_gui.<locals>.<lambda>   s    *T:J rk   )r   rb   zSelect Nonec                       d      S r   r   r   s   r$   rj   z$choose_scripts_gui.<locals>.<lambda>   s    :e;L rk   )   r   CancelRun)r   r   )returnNone)r   objectr   r   )r   rC   r   r   )!tkinterr[   ImportErrorRuntimeErrorr   r   listTktitleminsize
BooleanVarrC   Framerz   BOTHCanvas	Scrollbaryviewbindcreate_windowrf   YLabelrS   rT   Checkbuttonr{   Buttonr   LEFTRIGHTmainlooprA   )r   r   default_selected_reldefault_keep_openr[   excselected_relkeep_open_var	container	scrollbarscroll_framer+   rI   checkedr   rowspacerbottombtn_rowr   r   r   ri   r   r   r   r   r}   r   r   r~   s                        @@@@@@@@@@r$   choose_scripts_guir   o   sO   & +1r2L!H7mG557DJJ34LLcHIMM->(?M@MINNN-YYyaY0FYz6<<PI88F#LD TB
IMM2
KKV"''$K7NNbddN+35I? 
Q	 	 	

 $c$
, 	,A--)224C\)G--g-.C((<(CNN3S3N7<<&QT<UXXc]FKKVDrttK<IIcQS8XIY^^6 _  IIcQS8ZI[`` a  HHCbqrttH<c3]+#	,& XXd^F
KKRTTK,HHV    d#dNN/   d#Fd#hhvGLLbddL)  IIgL2JIKPPVXV]V]P^IIgM3LIMRRWW6 S  IIgHiI8==288=LIIgE6I277RXXF7SMMOT-++-.Y??K  9
 	s   
R" "	R<+R77R<)r   r   r   Sequence[str]r   
List[Path])zOpen_PowerBi.py)r   r   r.   r   r/   r   r0   r   r   r   r1   rB   r   r   )r   r   rE   rB   r   zTuple[List[str], bool])
r   r   r<   Sequence[Path]rJ   rC   rE   rB   r   r   r   )
r   r   r   r   r   zSequence[str] | Noner   rC   r   zTuple[List[Path], bool, bool])__doc__
__future__r   r>   pathlibr   typingr   r   r   DEFAULT_SELECTION_FILEr   r%   r7   rK   rY   r   r   rk   r$   <module>r      s   F "   ( ( 9 (  L "3 %  -	
    @ :P 	  +	$  	
 
. 26#	O@O@O@ /O@ 	O@
 #O@rk   