Ë
    Î£jù,  ã                   óÖ   — d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZmZmZ d d	lmZ  ej*                  «       Zd
ee   dee   fd„Z G d„ d«      Zy)é    N)ÚCallable)ÚPath)ÚVPKFile)Úconfig)ÚAdvancedParticleMerger)ÚStructureValidator)ÚcopyÚdeleteÚmove)ÚextractÚ	vpk_pathsÚreturnc                 óä   — i }| D ]Q  }|j                   }|dd j                  «       r|d   dk(  s|dd dk(  r|dd }|j                  |› d�z  ||<   ŒM|||<   ŒS t        |j	                  «       «      S )z†
    Normalize and deduplicate VPK paths.
    Multi-part VPKs (mod_000.vpk, mod_001.vpk, mod_dir.vpk) all resolve to mod_dir.vpk.
    éýÿÿÿNéüÿÿÿÚ_Ú_dirz_dir.vpk)ÚstemÚisdigitÚparentÚlistÚvalues)r   Ú
normalizedÚvpk_pathÚvpk_nameÚ	base_names        úIC:\Users\pivot\Documents\cueki\casual-preloader\core\services\importer.pyÚnormalize_vpk_pathsr      sŒ   € ð €JÛˆØ—=‘=ˆØ�R�SˆM×!Ñ!Ô#¨°©¸Ò(;ÀÈÈÀÐQWÒ@WØ   "˜ˆIØ$,§O¡O¸¸À8Ð6LÑ$LˆJ�yÒ!à#+ˆJ�xÒ ð ô �
×!Ñ!Ó#Ó$Ð$ó    c                   ó  — e Zd Zd„ Z	 	 ddededz  deeegdf   dz  dee	ef   fd„Z
	 ddedeeegdf   dz  dee	ef   fd	„Z	 dd
edeeegdf   dz  dee	ef   fd„Z	 ddee   deeegdf   dz  deee   eeeef      f   fd„Zy)ÚImportServicec                 ó"   — t        «       | _        y ©N)r   Ú	validator)Úselfs    r   Ú__init__zImportService.__init__%   s   € Ü+Ó-ˆ�r   NÚfolder_pathÚoverride_nameÚprogress_callbackr   c                 óì  ‡— |r|n|j                   }| j                  j                  |«      }	 t        |dz  j	                  d«      «      }|rMt
        j                  |z  }t        |d¬«       t        ||«       t        ˆfd„¬«      }|j                  |«       n‘t
        j                  |z  }t        |d¬«       t        ||«       |dz  }	|	j                  «       sP||j                  j                  «       d|› �d	gd
œ}
t        |	d«      5 }t!        j"                  |
|d¬«       d d d «       dd|› �fS # 1 sw Y   ŒxY w# t$        $ r,}t&        j)                  d|› �«       dd|› d|›�fcY d }~S d }~ww xY w)NÚ	particlesú*.pcfT©Únot_exist_okc                 ó<   •— ‰r ‰dt        | dz  «      z   |«      S d S ©Né2   é   ©Úint©ÚpÚmr)   s     €r   Ú<lambda>z.ImportService.process_folder.<locals>.<lambda>=   ó'   ø€ Ñ\mÑ3DÀRÌ#ÈaÐRSÉeË*Á_ÐVWÓ3XÐ3wÐswÐ3wr   ©r)   úmod.jsonzContent from folder: úCustom content©Ú
addon_nameÚtypeÚdescriptionÚcontentsÚwr2   ©ÚindentzSuccessfully processed folder zError processing folder Fú: )Únamer$   Úvalidate_folderÚanyÚglobr   Úparticles_dirr
   r	   r   Úpreprocess_vpkÚ
addons_dirÚexistsÚtype_detectedÚtitleÚopenÚjsonÚdumpÚ	ExceptionÚlogÚ	exception)r%   r'   r(   r)   Úfolder_nameÚvalidation_resultÚhas_particlesÚdestinationÚparticle_mergerÚmod_json_pathÚdefault_mod_infoÚfÚes      `         r   Úprocess_folderzImportService.process_folder(   s|  ø€ ñ (5‘m¸+×:JÑ:JˆØ ŸN™N×:Ñ:¸;ÓGÐð$	Jä ¨{Ñ!:× @Ñ @ÀÓ IÓJˆMáÜ$×2Ñ2°[Ñ@�Ü�{°Õ6Ü�[ +Ô.ô #9Û&wô#�ð  ×.Ñ.¨{Õ;ô %×/Ñ/°+Ñ=�Ü�{°Õ6Ü�[ +Ô.ð !,¨jÑ 8�Ø$×+Ñ+Ô-à&1Ø 1× ?Ñ ?× EÑ EÓ GØ)>¸{¸mÐ'LØ%5Ð$6ñ	(Ð$ô ˜m¨SÔ1°QÜŸ	™	Ð"2°A¸aÕ@÷ 2ð Ð9¸+¸ÐGÐGÐG÷ 2Ð1ûô
 ò 	JÜ�M‰MÐ4°[°MÐBÔCØÐ4°[°MÀÀAÀ5ÐIÐIÕIûð	Jús6   ®CD> Ä
D2Ä#D> Ä2D;Ä7D> Ä>	E3Å!E.Å(E3Å.E3Úzip_pathc                 óà  — |j                   }	 t        j                  «       5 }t        |«      }t	        ||«       t        |j                  «       «      }t        |«      dk(  rø|d   j                  «       rå|d   }| j                  j                  |«      }|j                  r#| j                  ||¬«      \  }	}
|	|
fcd d d «       S d}|j                  «       D ]Y  }|j                  «       sŒ| j                  j                  |«      }|j                  sŒ<| j                  ||¬«      \  }	}|	sŒU|dz  }Œ[ |dkD  rdd|› d|› �fcd d d «       S dd|› �fcd d d «       S | j                  j                  |«      }|j                  r$| j                  |||¬	«      \  }	}
|	|
fcd d d «       S d}|D ]Y  }|j                  «       sŒ| j                  j                  |«      }|j                  sŒ<| j                  ||¬«      \  }	}|	sŒU|dz  }Œ[ |dkD  rdd|› d|› �fcd d d «       S dd|› �fcd d d «       S # 1 sw Y   y xY w# t        $ r,}t        j                  d
|› �«       dd
|› d|›�fcY d }~S d }~ww xY w)Né   r   r:   TzSuccessfully processed z mods from FzNo valid mods found in )r(   r)   zError processing ZIP file rE   )r   ÚtempfileÚTemporaryDirectoryr   r   r   ÚiterdirÚlenÚis_dirr$   rG   Úis_validr_   rS   rT   rU   )r%   r`   r)   Úzip_nameÚtemp_dirÚ	temp_pathÚextracted_itemsÚsingle_folderrW   ÚsuccessÚmessageÚsuccess_countÚsub_itemÚsub_validationr   Úroot_validationÚitemr^   s                     r   Úprocess_zip_filezImportService.process_zip_fileX   sª  € ð —=‘=ˆð8	Iä×,Ñ,Ô.°(Ü  ›N�	ä˜ )Ô,ô #' y×'8Ñ'8Ó':Ó";�ä�Ó'¨1Ò,°ÀÑ1C×1JÑ1JÔ1Là$3°AÑ$6�MØ(,¯©×(FÑ(FÀ}Ó(UÐ%Ø(×1Ò1à+/×+>Ñ+>¸}Ð`qÐ+>Ó+rÑ(˜ Ø&¨Ð/÷ /Ñ.ð& )*˜Ø(5×(=Ñ(=Ö(?˜HØ'Ÿ™Õ0Ø15·±×1OÑ1OÐPXÓ1Y Ø#1×#:Ó#:Ø15×1DÑ1DÀXÐarÐ1DÓ1s¡J G¨QÚ'.Ø(5¸Ñ(:©ð )@ð )¨1Ò,Ø#'Ð+BÀ=À/ÐQ\Ð]eÐ\fÐ)gÐ#g÷9 /Ñ.ð:  %Ð(?À¸zÐ&JÐJ÷; /Ñ.ðB '+§n¡n×&DÑ&DÀYÓ&O�OØ&×/Ò/à+/×+>Ñ+>¸yÐX`ð  uFÐ+>ó  ,GÑ(˜ Ø&¨Ð/÷K /Ñ.ðP %&�MÛ /˜ØŸ;™;�=Ø04·±×0NÑ0NÈtÓ0TÐ-Ø0×9Ó9Ø-1×-@Ñ-@ÀÐYjÐ-@Ó-k¡
 ¨Ú#*Ø$1°QÑ$6¡Mð !0ð % qÒ(Ø#Ð'>¸}¸oÈ[ÐYaÐXbÐ%cÐc÷c /Ñ.ðd !Ð$;¸H¸:Ð"FÐF÷e /×.Ò.ûôh ò 	IÜ�M‰MÐ6°x°jÐAÔBØÐ6°x°jÀÀ1À%ÐHÐHÕHûð	Iúsœ   ŽH8 ¢BH,Â9	H8 Ã%H,Ã)'H,ÄH,Ä*H,Ä?	H8 Å	H,Å	H8 ÅAH,Æ	H8 Æ$H,Æ<'H,Ç$H,Ç=H,È	H8 ÈH,È"	H8 È,H5È1H8 È5H8 È8	I-É!I(É"I-É(I-Ú	file_pathc                 ó@  ‡— 	 |j                   }|dd  j                  «       r|d   dk(  s|dd  dk(  r|d d }‰r	 ‰dd«       | j                  j                  |«      }t        j
                  |z  }t        j                  |z  }|j                  dd¬«       ‰r	 ‰d	d
«       t        |«      }t        |j                  d«      «      }‰r	 ‰dd«       |j                  t        |«      «      }	‰r ‰dd|	› d�«       |r,‰r	 ‰dd«       t        ˆfd„¬«      }
|
j                  |«       n¤‰r	 ‰dd«       t        |d¬«       t!        ||«       |dz  }|j#                  «       sk||j$                  dk7  r|j$                  j'                  «       ndd|j(                  › �dgdœ}t+        |d«      5 }t-        j.                  ||d¬ «       d d d «       dd!|› �fS # 1 sw Y   ŒxY w# t0        $ r5}d"|j(                  › d#|›�}t2        j5                  |«       d$|fcY d }~S d }~ww xY w)%Nr   r   r   r   é   zValidating VPK structure...T)ÚparentsÚexist_oké
   zAnalyzing VPK...r,   é   zExtracting files...é#   z
Extracted z filesr1   zProcessing particles...c                 ó<   •— ‰r ‰dt        | dz  «      z   |«      S d S r0   r3   r5   s     €r   r8   z0ImportService.process_vpk_file.<locals>.<lambda>À   r9   r   r:   é<   zCreating addon folder...r-   r;   ÚunknownÚUnknownzContent extracted from r<   r=   rB   r2   rC   zSuccessfully processed VPK zError processing VPK rE   F)r   r   r$   Úvalidate_vpkr   rJ   rL   Úmkdirr   ÚboolÚ
find_filesÚextract_allÚstrr   rK   r
   r   rM   rN   rO   rF   rP   rQ   rR   rS   rT   rU   )r%   rv   r)   r   rW   Úextracted_particles_dirÚextracted_addons_dirÚvpk_handlerrX   Úextracted_countrZ   r[   r\   r]   r^   Ú	error_msgs     `             r   Úprocess_vpk_filezImportService.process_vpk_fileš   sH  ø€ ð?	$Ø —~‘~ˆHØ˜˜ˆ}×$Ñ$Ô&¨8°B©<¸3Ò+>À(È2È3À-ÐSYÒBYØ# C R˜=�ñ !Ù! !Ð%BÔCØ $§¡× ;Ñ ;¸IÓ FÐä&,×&:Ñ&:¸XÑ&EÐ#Ü#)×#4Ñ#4°xÑ#?Ð Ø#×)Ñ)°$ÀÐ)ÔFá Ù! "Ð&8Ô9Ü! )Ó,ˆKô ! ×!7Ñ!7¸Ó!@ÓAˆMá Ù! "Ð&;Ô<Ø)×5Ñ5´cÐ:QÓ6RÓSˆOÙ Ù! "¨
°?Ð2CÀ6Ð&JÔKñ Ù$Ù% bÐ*CÔDÜ"8Û&wô#�ð  ×.Ñ.Ð/FÕGñ %Ù% bÐ*DÔEô Ð+¸$Õ?ô Ð,Ð.BÔCð !5°zÑ A�Ø$×+Ñ+Ô-à&.ØK\×KjÑKjÐnwÒKwÐ 1× ?Ñ ?× EÑ EÔ Gð  ~GØ)@ÀÇÁÐ@PÐ'QØ%5Ð$6ñ	(Ð$ô ˜m¨SÔ1°QÜŸ	™	Ð"2°A¸aÕ@÷ 2ð Ð6°x°jÐAÐAÐA÷ 2Ð1ûô
 ò 	$Ø/°	·±Ð/?¸rÀ!ÀÐGˆIÜ�M‰M˜)Ô$Ø˜)Ð#Õ#ûð	$ús6   ƒF(G Æ+GÇG ÇGÇG Ç	HÇ(*HÈHÈHÚ
item_pathsc                 ó¸  — t        |«      }g }g }t        |«      D ]ó  \  }}|j                  }|r |dd|dz   › d|› �«       	 |j                  «       r| j	                  ||¬«      \  }	}
n|j
                  j                  «       dk(  r| j                  ||¬«      \  }	}
nK|j
                  j                  «       dk(  r| j                  ||¬«      \  }	}
n|j                  |d|› �f«       ŒÍ|	r|j                  |«       n|j                  ||
f«       Œõ ||fS # t        $ r;}d	|› d
|›�}t        j                  |«       |j                  ||f«       Y d }~�Œ9d }~ww xY w)Nr   zProcessing item rb   Ú/r:   z.zipz.vpkzUnsupported file type: zError processing rE   )rf   Ú	enumeraterF   rg   r_   ÚsuffixÚlowerru   r�   ÚappendrS   rT   rU   )r%   rŽ   r)   Útotal_itemsÚsuccessful_itemsÚfailed_itemsÚindexÚ	item_pathÚ	item_namern   ro   r^   rŒ   s                r   Úprocess_dropped_itemsz#ImportService.process_dropped_itemsá   sz  € ô ˜*“oˆØÐØˆä )¨*Ö 5ÑˆE�9Ø!Ÿ™ˆIÙ Ù! !Ð'7¸À¹	°{À!ÀKÀ=Ð%QÔRð<Ø×#Ñ#Ô%à'+×':Ñ':¸9ÐXiÐ':Ó'jÑ$�G™WØ×%Ñ%×+Ñ+Ó-°Ò7à'+×'<Ñ'<¸YÐZkÐ'<Ó'lÑ$�G™WØ×%Ñ%×+Ñ+Ó-°Ò7à'+×'<Ñ'<¸YÐZkÐ'<Ó'lÑ$�G™Wà ×'Ñ'¨Ð6MÈiÈ[Ð4YÐ(ZÔ[ØáØ$×+Ñ+¨IÕ6à ×'Ñ'¨°GÐ(<Ô=øð- !6ð:   Ð-Ð-øô ò <Ø/°	¨{¸"¸Q¸EÐB�	Ü—‘˜iÔ(Ø×#Ñ# Y°	Ð$:×;Ò;ûð<ús   ÁB%DÃ('DÄ	EÄ0EÅE)NNr#   )Ú__name__Ú
__module__Ú__qualname__r&   r   r‡   r   r4   Útupler„   r_   ru   r�   r   r›   © r   r   r!   r!   #   sP  „ ò.ð %)Ø?Cñ	.Jàð.Jð ˜T‘zð.Jð $ S¨# J°Ð$4Ñ5¸Ñ<ð	.Jð
 
ˆt�SˆyÑ	ó.Jðf @Dñ@Iàð@Ið $ S¨# J°Ð$4Ñ5¸Ñ<ð@Ið 
ˆt�SˆyÑ	ó	@IðJ @DñE$àðE$ð $ S¨# J°Ð$4Ñ5¸Ñ<ðE$ð 
ˆt�SˆyÑ	ó	E$ðT @Dñ'.à˜‘Jð'.ð $ S¨# J°Ð$4Ñ5¸Ñ<ð'.ð 
ˆt�C‰y˜$˜u S¨# X™Ñ/Ð/Ñ	0ô	'.r   r!   )rQ   Úloggingrc   Úcollections.abcr   Úpathlibr   Úvalve_parsersr   Úcore.configr   Ú(core.operations.advanced_particle_mergerr   Úcore.structure_validatorr   Úcore.util.filer	   r
   r   Úcore.util.zipr   Ú	getLoggerrT   r   r   r!   r    r   r   Ú<module>r«      s`   ðÛ Û Û Ý $Ý å !å Ý KÝ 7ß -Ñ -Ý !à€g×ÑÓ€ð% 4¨¡:ð %°$°t±*ó %÷"e.ò e.r   