
    ˀhW                    L   U 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 d dlmZ d d	lmZmZmZ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"m#Z# er>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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5 d dl6m7Z7 d8d9dZ8dZ9dZ:ededediZ;de<d<    G d d      Z=d:d Z>d;d!Z?	 	 	 	 d<d"Z@	 	 	 	 	 	 	 	 	 	 	 	 	 	 d=d#ZAed$d%	 	 	 	 	 	 	 	 	 	 	 d>d&       ZBe	 	 	 	 	 	 	 	 	 	 	 	 d?d'       ZBd(d%	 	 	 	 	 	 	 	 	 	 	 d@d)ZB	 	 	 	 	 	 	 	 	 	 dAd*ZCd+d+d,	 	 	 	 	 	 	 	 	 dBd-ZD	 	 	 	 	 	 	 	 	 	 	 	 	 	 dCd.ZEdDd/ZF	 	 	 	 	 	 	 	 	 dE	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dFd0ZG	 	 	 	 dGd1ZHd2d3	 	 	 	 	 	 	 dHd4ZI	 dI	 	 	 	 	 dJd5ZJdKd6ZKdLd7ZLy+)M    )annotations)Sequence)BytesIO)PathLike)Path)TYPE_CHECKINGAnyoverload)	functions)qualified_type_name)DateDatetimeFloat64Int64Time)FLOAT_DTYPESINTEGER_DTYPES)json)DuplicateError)_expand_selector_dicts_expand_selectorsnumeric)Iterable)LiteralWorkbookFormat	Worksheet)	DataFrameSchemaSeries)ColumnFormatDictColumnTotalsDefinitionConditionalFormatDictOneOrMoreDataTypesPolarsDataTypeRowTotalsDefinition)Exprc                ,    t        t        |       g|z   S N)zipiter)iterablens     ~/var/www/html/wine-match-dev/backend/winematch-backend/venv/lib/python3.12/site-packages/polars/io/spreadsheet/_write_utils.py_clusterr2   +   s    h 1$%%    z#,##0.000;[Red]-#,##0.000z#,##0;[Red]-#,##0zyyyy-mm-dd hh:mm:sszyyyy-mm-dd;@z
hh:mm:ss;@zdict[PolarsDataType, str]_XL_DEFAULT_DTYPE_FORMATS_c                  2    e Zd ZdZddZedd       ZddZy)	_XLFormatCachezGCreate/cache only one Format object per distinct set of format options.c                     i | _         || _        y r,   )_cachewb)selfr9   s     r1   __init__z_XLFormatCache.__init__;   s    )+r3   c                :    t        j                  | dt              S )NT)	sort_keysdefault)r   dumpsstr)fmts    r1   _keyz_XLFormatCache._key?   s    zz#s;;r3   c                    t        |t              s|}|S | j                  |      }| j                  j	                  |      }|*| j
                  j                  |      }|| j                  |<   |S r,   )
isinstancedictrB   r8   getr9   
add_format)r:   rA   wbfmtkeys       r1   rF   z_XLFormatCache.getC   se    #t$E  ))C.CKKOOC(E}**3/#(C r3   N)r9   r   returnNone)rA   dict[str, Any]rJ   r@   )rA   zdict[str, Any] | FormatrJ   r   )__name__
__module____qualname____doc__r;   staticmethodrB   rF    r3   r1   r6   r6   8   s#    Q < <	r3   r6   c           	          t         fd|D              }|t        t        t        |      t        |      dz               k7  ry j                  }|d   ||d      d|d<   |d   ||d      d|d<   y	)
z>Indicate if the given columns are all adjacent to one another.c              3  @   K   | ]  }j                  |        y wr,   )get_column_index).0coldfs     r1   	<genexpr>z!_adjacent_cols.<locals>.<genexpr>Q   s     ;s"%%c*;s      Fr   )idxnameminmaxT)sortedranger]   r_   columns)rX   colsmin_maxidxsrb   s   `    r1   _adjacent_colsrf   O   sx    ;d;;DveCIs4y1}566**!%a'$q'2BC!%b7483DEr3   c                ,    t        fd| D              S )z4Indicate if the given columns are all integer-typed.c              3  D   K   | ]  }|   j                           y wr,   )
is_integer)rV   rW   schemas     r1   rY   z$_all_integer_cols.<locals>.<genexpr>]   s     8Cvc{%%'8s    )all)rc   rj   s    `r1   _all_integer_colsrl   [   s    84888r3   c                    t        | t              s| S i }| j                         D ]4  \  }}t        |t              st        |t              s|f}|D ]  }|||<   	 6 |S )zCUnpack multi-col dictionary into equivalent single-col definitions.)rD   rE   itemsr@   r   )dunpackedrI   valueks        r1   _unpack_multi_column_dictrs   `   sj     a!Hggi  
Uc3z#x'@&C 	 AHQK	  
 Or3   c                  ddl m} t        | |ddd      j                         D ]  \  }}t	        |t
              s"t        |      dk(  rt        t        |            }t	        |t
        t        f      r|g}|D ]  }	t	        |	t              sd|	i}	t	        |t
              rt        | |||      }
n;t        | |||      }
d	|
v r(t        t        |            }|
|	d
<   t        | |||      }
d|	v r;|	d   }t	        ||      r|n$|j                  t	        |t
              rd|in|      |	d<   |j                  |
|	         y)zJTake all conditional formatting options and apply them to the table/range.r   r   TFexpand_keysexpand_values
tuple_keysrZ   typeinclude_header multi_rangeformat
num_formatN)xlsxwriter.formatr   r   rn   rD   r@   lennextr.   rE   _xl_column_range_xl_column_multi_rangerF   conditional_format)rX   wsconditional_formatstable_startr{   format_cacher   rc   formatsrA   	col_rangerW   fs                r1   _xl_apply_conditional_formatsr   o   sT    )/
TSWeg#2g $$TaT
#DgT{+iG 	2Cc4(sm$$,T.	 3T.	 )#tDz*C)2C& 0K^!I 3M "!V, %))-73-?q)Q H !!)S17	2#2r3   .)as_rangec                    y r,   rR   rX   r   rW   r{   r   s        r1   r   r      s     r3   c                    y r,   rR   r   s        r1   r   r      s     !$r3   Tc               2   |d   t        |      z   |d   t        |t              r| j                  |      n|d   z   f}|d   | j                  z   dz
  |d   t        |t              rdn
|d   |d   z
  z   f}|rdj                  t        g ||       S ||z   S )zKReturn the Excel sheet range of a named column, accounting for all offsets.r   rZ    )intrD   r@   rU   heightjoin_xl_rowcols_to_range)rX   r   rW   r{   r   	col_start
col_finishs          r1   r   r      s     	A^,,Ajc6J"--c2PSTUPVWI
 	!ryy 1$!ZS1AQIJ ww+DYDDEE:%%r3   c                    i }t         ||      rt         |d   d   |d   d   f      S dj                   fd|D              S )zNReturn column ranges as an xlsxwriter 'multi_range' string, or spanning range.rd   r]   r[   r_   rz   r|   c              3  <   K   | ]  }t        |         yw)rz   N)r   )rV   rW   rX   r{   r   s     r1   rY   z)_xl_column_multi_range.<locals>.<genexpr>   s'       	[#nMMs   )rf   r   r   )rX   r   rc   r{   ms   `` ` r1   r   r      sd     Ab$*uXe_ahuo.)	
 	
 88   r3   N)dtypeexprc                  t        | j                        | j                  j                         }i |j                         D ]  \  }}|v rd|d}t	        |      t        |t              s|j                  |       =|j                  d      |<   |j                  d      }|j                  d      }	|	||j                  |       ||j                  |	      dz   n|j                  |      }
|j                  |
|        t        j                  d      n| j                  fd|D              } | S )	zHInsert dummy frame columns in order to create empty/named table columns.zcannot create a second z columnreturn_dtypeinsert_beforeinsert_afterNrZ   c           
   3     K   | ]u  }|v r|njsj                  |      Gj                  j                  |t        t              rj                  |t              n            nj                  |       w y wr,   )rF   castrD   rE   r   alias)rV   rW   cast_lookupdf_original_columnsr   r   s     r1   rY   z1_xl_inject_dummy_table_columns.<locals>.<genexpr>  s        ))  [__S1= 		OO3=eT3J		#w/PU eCjs   A;A>)setrb   copyrn   r   rD   rE   appendrF   indexinsertFlitselect)rX   coldefsr   r   df_select_colsrW   
definitionmsgr   r   
insert_idxr   r   s     ``       @@r1   _xl_inject_dummy_table_columnsr      s>    bjj/ZZ__&NK"==? 7Z%%+C7':C %%J-!!#&)~~n=K&NN?;M%>>.9L#(=%%c* %, #((6:'--m< 
 %%j#6'7* ,155;DD	  " 
B" Ir3   c               `   ddl m} i }t        |t              r|j	                  d      n|}|sd}	t        |	      t        |||      sd}	t        |	      t        ||||d      \  }
}}}|d	   |d
   d   z   }|d	   |d   d   z   }t        |t              si }nA|j                         D ci c]  \  }}|dvr|| }}}d|vr|j	                  d      dv |d<   t        |j                        D ]6  } ||
|      } ||
|      }| d| |d<   | j                  |
||       |
d	z  }
8 yc c}}w )z@Inject sparklines into (previously-created) empty table columns.r   xl_rowcol_to_cellrb   z;supplying 'columns' param value is mandatory for sparklinesr   z.sparkline data range/cols must all be adjacentF)r{   r   rZ   r]   r[   r_   )rb   r   r   negative_pointsry   )columnwin_loss:ra   N)xlsxwriter.utilityr   rD   rE   rF   
ValueErrorrf   RuntimeErrorr   rn   ra   r   add_sparkline)r   rX   r   rW   r{   paramsr   r   	data_colsr   spk_rowspk_col_data_start_coldata_end_coloptionsr\   val
data_startdata_ends                       r1   _xl_inject_sparklinesr     sm    5A)3FD)A

9%vIKoB	15>3-
K^eGWa !^ahuo5Nq>AeHUO3Lfd#
 $\\^
cGG #I
 

 G+)0V)<@V)VG%&299 &w?
$Wl;(\8*5
'731
s   -D*c                     ddl m fdt        |       D        }t        |      D cg c]  \  }}| d|  c}}S c c}}w )z@Return list of "A1:B2" range refs from pairs of row/col indexes.r   r   c              3  6   K   | ]  \  }} ||        y wr,   rR   )rV   rowrW   r   s      r1   rY   z'_xl_rowcols_to_range.<locals>.<genexpr>M  s     Uc"3,Us   r   )r   r   r2   )row_col_pairs	cell_refs
cell_startcell_endr   s       @r1   r   r   I  s>    4UXm=TUICKICVW+?:xzl!H:&WWWs   ?c                   dd}| j                   j                         D cg c]X  \  }}|j                         s|j                         r3t	        j
                  |      j                  |      j                  |      Z }}}|r| j                  |      } t        t        | |ddd            }|sd}i }n_| j                   }|j                         D ch c]  \  }}|j                         s| }}}t        |t              st        ||      rt        nt         }|du r|n't        |t"              r|hnt%        t'        | |            }t)        d | j*                  D              }|| j,                  dz  kD  rdnd	 d
}|t/        | |d      i}|g}nt        | |dd      }|j                         D ci c]$  \  }}|t        |du r|n||      rt        nt         & }}}|j                         D ci c]  \  }}|t/        | |du r|n|d       }}}|du r't1               dit        j3                  |xs dd      }nFt        |t"              r6|j5                         }t1               |it        j3                  |xs d|      }t        t        |t              rt        | |dd      nt'        | |            }t        |t6              rt        j3                  |d      n!t        |t              r|j9                         ni }|xs i j                         D ci c]  \  }}|t        |t"              rd|in| }}}t        |xs i       }t        |xs i       }t;        |      D ]M  }t        |t<        t>        f      s|jA                  t        j3                  ||jC                  |                   O |jE                         D ]/  }t        |t"              rd|dtG        |      d}tI        |       |rtK        | |      } |rtK        | |      } |rtK        | ||      } |jM                  ddi      }|
tN        } tP        }!n2tN        jS                  dd      d   } tP        jS                  dd      d   }!tT        D ]  }| tV        |<    d|	z  }"|"s| n|!jY                  dd|"       }#tV        j                         D ]  \  }}|j[                  ||        t\        D ]  }|j[                  ||#        |j                         D ]
  \  }}|||<    | j                   j                         D ]J  \  }}|j_                         }$|$|v r'|jM                  |||$         }|j[                  ||       ||vsF|||<   L |j                         D ]  \  }}t        |t"              r|jM                  |dd      ||<   .t        |t              s?d|vr'| j                   jM                  |      }||v r||   |d<   d|vrd|d<   |jM                  |      ||<    |r|jM                  |      nd}%| j*                  D &'cg c]r  }|||   |%|jM                  |      |jM                  |      xs! |jM                  |i       jM                  d      dj                         D &'ci c]
  \  }&}'|'|&|' c}'}&t }(}&}}'|(|| fS c c}}w c c}}w c c}}w c c}}w c c}}w c c}'}&w c c}'}&}w )z7Setup and unify all column-related formatting/defaults.c           	         | j                  | j                  | j                         D cg c]  }|d n
t        |       c}      S c c}w r,   )	__class__r\   to_listr@   )svs     r1   _map_strz)_xl_setup_table_columns.<locals>._map_stra  s=    {{FFaiikJaidSV3J
 	
Js   A
TFru   Nc              3  J   K   | ]  }|r|d    ndj                           yw)r   r   N)isupperrV   cs     r1   rY   z*_xl_setup_table_columns.<locals>.<genexpr>  s!     LA11Q4"557Ls   !#   Ttotalsum)rv   rw   rR   formulazinvalid dtype_format value: z (expected format string, got ))r   valignvcenter;rZ   r   0z.000.)r   r   r   )headerr~   header_formattotal_functionr   )r   r#   rJ   r#   )0rj   rn   	is_nested	is_objectr   rW   map_batchesr   with_columnsrs   r   
is_numericrD   rE   rl   r   r   r@   r   r   r   rb   width_xl_table_formular   fromkeyslowerr   r   listtuple	frozensetupdatepopvaluesr   	TypeErrorr   rF   _XL_DEFAULT_INTEGER_FORMAT__XL_DEFAULT_FLOAT_FORMAT_splitr   r4   replace
setdefaultr   	base_type))rX   r   column_totalscolumn_formatsdtype_formatsr   
sparklinesformulas
row_totalsfloat_precisiontable_styler   rW   tp	cast_colsrow_totals_dtyperow_total_funcsrj   numeric_colssum_colsn_ucasetotalnmrc   r\   fncolumn_total_funcsr   column_formulasrA   r   fmt_defaultint_base_fmtflt_base_fmtzeros	fmt_floatr  col_header_formatrr   r   table_columnss)                                            r1   _xl_setup_table_columnsr   Q  s+    
 yy(C<<>R\\^ 	
c
x(..s3I 
 __Y' /DRV	
N +1<<>MRR]]_MM*d+*<@g 
 %  "*c2  L.r:>?  LLLG&Q6sSAFE$&7He&LMOJ/JEJ !+ 0 0 2  B (4QWX  !    #-"2"2"4	 D$ '4% O   ETT]]:;KU-ST	M3	'  " BN$--
8Hb"*MN-mT* 	r=dRWXr=1M mX. 	mU+&0&Em  "2  &^224C 	Z%=i!7JO  ..B/N,"-M=! Kb5),-  r=3D3DR3H!IJK ##% !#s#07UVijmVnUqqrsCC. ! +B
;+B@+BGWX ""Hi#89K20 388a@C066sA>qA 6)5"2&6 /!E$)|/C/CFaPUwK/XI .335 *C  S)* 0  Y/0 &&(  Cb  99??$ .RLLN	%##Bi(@AC%%c3/n$"-N3. #((* 8Sc3"."2"2"i8#N3 T"3&YY]]3'&(5b(9C%s" )H"."2"23"7N38 <I((7d$ ::   (-!2"4"8"8"=#'', C&**3377	B	 eg	
1 } qD	
M " .",,[* N, 4`	
s=   AZ7Z=.Z=5)[4[	![7A"[[([[c                    t        | t              rCd}| D ]  }||vsd|}t        |       | j                         }|j	                  dd      } | |fS i }| |fS )zESetup table options, distinguishing style name from other formatting.)stylebanded_columnsbanded_rowsfirst_columnlast_columnzinvalid table style key: r"  N)rD   rE   r   r   r   )r  valid_optionsrI   r   table_optionss        r1   _xl_setup_table_optionsr)    s     +t$
  	&C-'1#9 o%	&
 $((*#''6 %% %%r3   Freturn_worksheetc                   t        fd| j                         D              r|rS dS d| j                  dj                  }t	        |      )Nc              3  &   K   | ]  }|u  
 y wr,   rR   )rV   sheetr   s     r1   rY   z,_xl_worksheet_in_workbook.<locals>.<genexpr>2  s     
452;
4s   Tzthe given workbook object z  is not the parent of worksheet )any
worksheetsfilenamer\   r   )r9   r   r+  r   s    `  r1   _xl_worksheet_in_workbookr2  /  sO     
4BMMO
44%r/4/&r{{o5UVXV]V]U`
aC
S/r3   c                   ddl m} ddlm} t	        | |      r1| d}}t	        ||      rt        ||      r|n|j                  |      }nt	        ||      rd| }t        |      ddt        t           d}t	        | t              r || |      d	d}}}n| t        d
      }	nt	        | t              rt        |       }	n| }	t	        |	t              r=|	j                  r|	n|	j                  d      j!                         j#                  d      }	 ||	|      }d\  }}|-t	        ||      rt        ||d      }n|j%                  |      }|||fS )z2Establish the target Excel workbook and worksheet.r   r   r   F)r\   zEworksheet object requires the parent workbook object; found workbook=T)nan_inf_to_errorsstrings_to_formulasdefault_date_formatNzdataframe.xlsxz.xlsx)strict)NTr*  )
xlsxwriterr   xlsxwriter.worksheetr    rD   r2  get_worksheet_by_namer   r4   r   r   r   r@   r   suffixwith_suffix
expanduserresolveadd_worksheet)
workbook	worksheetr   r    r9   	can_closer   r   workbook_optionsfiles
             r1   _xl_setup_workbookrE  8  sc   
 $.(H% %I 9i0-b)< 
 ))y)9 	 
Iy	)UV^Uabn "&#(#=d#C

 h( (3C DdDIB,-Hc*H~$)![[Td.>.>w.GZ\WEW* 
 $ 01B&MB		zi+*2y4PB!!y!1Br9r3   c                    i }t        |t              r|g}t        | ||      r&d|j                          d|d   d    d|d   d    dS d	j	                  d
 |D              }d|j                          d| dS )zIReturn a formula using structured references to columns in a named table.r   =z([@[r]   r\   z]:[r_   z]]),c              3  (   K   | ]
  }d | d  yw)z[@[z]]NrR   r   s     r1   rY   z$_xl_table_formula.<locals>.<genexpr>v  s     51S2;5s   (r   )rD   r@   rf   upperr   )rX   rc   funcr   colrefss        r1   r   r   n  s    A$vb$*4::<.QuXf%5$6c!E(6:J9K3OO((5554::<.'!,,r3   c                    dt               }| j                         D ]&  }|j                  fd|j                  D               ( t	        |      } | }||v r|dz  } | }||v r|S )z4Establish a unique (per-workbook) table object name.Framec              3  R   K   | ]  }|d    j                        s|d       yw)r\   N)
startswith)rV   tbltable_prefixs     r1   rY   z(_xl_unique_table_name.<locals>.<genexpr>  s+      
F0F0F|0TCK
s   '
'rZ   )r   r0  r   tablesr   )r9   polars_tablesr   r0   
table_namerS  s        @r1   _xl_unique_table_namerW  z  s    L!eMmmo 
 
#%99
 	

 	MA >!%J

%	Q$~aS)
 
% r3   )r   )r/   Iterable[Any]r0   r   rJ   rX  )rX   r!   rc   Iterable[str]rd   rL   rJ   bool)rc   rY  rj   r"   rJ   rZ  )ro   z$dict[str | Sequence[str], Any] | AnyrJ   zdict[str, Any] | Any)rX   r!   r   r    r   r&   r   tuple[int, int]r{   rZ  r   r6   rJ   rK   )rX   r!   r   r[  rW   str | tuple[int, int]r{   rZ  r   zLiteral[True]rJ   r@   )rX   r!   r   r[  rW   r\  r{   rZ  r   zLiteral[False]rJ   ztuple[int, int, int, int])rX   r!   r   r[  rW   r\  r{   rZ  r   rZ  rJ   ztuple[int, int, int, int] | str)
rX   r!   r   r[  rc   rY  r{   rZ  rJ   r@   )
rX   r!   r   rL   r   z1dict[str, PolarsDataType] | PolarsDataType | Noner   zExpr | NonerJ   r!   )r   r    rX   r!   r   r[  rW   r@   r{   rZ  r   zSequence[str] | dict[str, Any]rJ   rK   )r   r   rJ   z	list[str])	NNNNNNN   N)rX   r!   r   r6   r  zColumnTotalsDefinition | Noner  zColumnFormatDict | Noner  z$dict[OneOrMoreDataTypes, str] | Noner   zdict[str, Any] | Noner  z0dict[str, Sequence[str] | dict[str, Any]] | Noner	  z&dict[str, str | dict[str, str]] | Noner
  zRowTotalsDefinition | Noner  r   r  dict[str, Any] | str | NonerJ   zHtuple[list[dict[str, Any]], dict[str | tuple[str, ...], str], DataFrame])r  r^  rJ   z2tuple[dict[str, Any] | str | None, dict[str, Any]])r9   r   r   r    r+  rZ  rJ   zbool | Worksheetr,   )r@  z&Workbook | BytesIO | Path | str | NonerA  zstr | Worksheet | NonerJ   z tuple[Workbook, Worksheet, bool])rX   r!   rc   rY  rL  r@   rJ   r@   )r9   r   rJ   r@   )M
__future__r   collections.abcr   ior   osr   pathlibr   typingr   r	   r
   polarsr   r   polars._utils.variousr   polars.datatypesr   r   r   r   r   polars.datatypes.groupr   r   polars.dependenciesr   polars.exceptionsr   polars.selectorsr   r   r   r   r   r8  r   r   r   r9  r    r!   r"   r#   polars._typingr$   r%   r&   r'   r(   r)   polars.exprr*   r2   r   r   r4   __annotations__r6   rf   rl   rs   r   r   r   r   r   r   r   r)  r2  rE  r   rW  rR   r3   r1   <module>ro     s   " $    / / ! 5  @ $ , O O(#(.00  !& 8 1 #.,9 5  .	9
+/2/2/2 /	/2
 !/2 /2 !/2 
/2d 
 "  

   	 
 
$$ $ 
$
 $ $ $ 
$  && & 
&
 & & %&.  
  	4 @D333 =	3
 3 3l,,, !, 
	, , +, 
,^X 48.2:>+/CG7;-1/3B-B- B- 1B- ,	B-
 8B- )B- AB- 5B- +B- B- -B- NB-J&,&7&4 >C6: )-343%3 &3l	-r3   