
    h5!                        d dl Z d dlZ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	m
Z
 d dlZd dlZd dlZd dlmZ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  e
de      Z	 	 	 	 d(dede	e   dede de de dz  de fdZ!d)dede fdZ"	 d*dede	e   de dz  de dz  de f
dZ#d Z$de fdZ%d+dede fdZ&d Z'd,d Z(d-d!e d"e d#ede)fd$Z*d%e de fd&Z+de dz  fd'Z,y).    N)StringIO)Path)TypeTypeVar)HTTPExceptionstatus)StreamingResponse)slugify)Session)Base)	Separator)pwd_context	ModelType)bounddbinstancelengthprepend	separatornew_secure_idreturnc           
         ||}n[|j                  |j                         t        j                         j	                  |t        |      t        |      z   z
        g      }| j                  |      j                  |j                  |k(        j                         }|r$t        d      }| d| }	t        | |||||	      S |S )a-  Function to return a random cryptogrqaphically secure id

    @Params:
    prepend: string - Anything that needs to be prepended to the id
    length: int - Desired length of id to generate
    separator: string - A character set to join the prepended text with random id

    @Output:
    string
    )r      size-)r   r   r   r   r   new_slug)joinlower	shortuuid	ShortUUIDrandomlenqueryfilter
session_idfirstrandom_string_generatorgenerate_secure_id)
r   r   r   r   r   r   	secure_id	qs_existsrandom_suffixr   s
             U/var/www/html/wine-match-dev/backend/winematch-backend/src/utils/helpers/functions.pyr)   r)      s    $  !	NN##%,,Vs7|cR[n?\5],_
	 "))(*=*=*JKQQSI/Q7[-1!HVWPYdl
 	
     r   c                     dj                  t        j                  t        j                  t        j
                  z   |             S )z
    Generate a cryptographically secure random string of specified length.

    Args:
        size: Length of the random string to generate. Defaults to 5.

    Returns:
        A random string containing uppercase letters and digits.
     kr   r"   choicesstringascii_uppercasedigitsr   s    r-   r(   r(   B   s-     776>>&"8"86=="HDQRRr.   
slug_labelr   c                     ||}n|t        |      }nt        d      | j                  |      j                  |j                  |k(        j                         }|r"t        d      }| d| }t        | ||d      S |S )an  
    Generate a unique slug for database models with slug fields.

    This function is designed for FastAPI/SQLAlchemy projects and ensures
    slug uniqueness by appending a random string when collisions occur.

    Args:
        db: SQLAlchemy database session.
        instance: The model class to query against.
        slug_label: Text to be converted into a slug. Required if new_slug is None.
        new_slug: Pre-generated slug to check for uniqueness. Optional.

    Returns:
        A unique slug string safe for database storage.

    Raises:
        ValueError: If both slug_label and new_slug are None.
    Nz.Either slug_label or new_slug must be providedr   r   r   )r   r   r   r8   )r
   
ValueErrorr$   r%   slugr'   r(   generate_unique_slug)r   r   r8   r   r;   r+   r,   s          r-   r<   r<   O   s    * 		z"IJJ "))(--4*?@FFHI/Q7V1]O,#rHx\`aaKr.   c                 ,    t        j                  |       S N)r   hash)passwords    r-   get_password_hashrA   v   s    H%%r.   c                      dj                  t        j                  t        j                  d            } dj                  t        j                  t        j
                  d            }| |z   }|S )zNGenerate a unique code consisting of 4 uppercase letters followed by 8 digits.r0   r   r1      r3   )lettersr7   r;   s      r-   generate_unique_coderE   z   sM    ggfnnV%;%;qABGWWV^^FMMQ78FVDKr.   keyc                 
    |}|S )z-Get a setting value from the settings object. )r   rF   defaultTOKEN_VALUEs       r-   get_site_settings_valuerK      s    K r.   c                   K   |D cg c]  }| D ci c]  }|t        ||d       c}  }}}t        j                  ||       }t               }|j	                  |d       |j                  d       |S c c}w c c}}w w)z<Generate a CSV file with headers using pandas and return it.r0   )columnsF)indexr   )getattrpd	DataFramer   to_csvseek)rM   datarowcol	dict_datadfoutputs          r-   generate_csvrZ      sv      MQQS@#wsC,,@QIQ	i	1BZFIIfEI"
KKNM AQs&   B 	A:A5A:A
B 5A::B c                 J    | j                         }dj                  |d |       S N )splitr   )text	max_wordswordss      r-   truncate_to_wordsrb      s#    JJLE88E*9%&&r.   	file_pathcustom_delimiterrowsc                    t        |       j                  j                         }d}t        d|        	 t	        |dddddg      }|d	k(  rt        j                  | |
      }n|dk(  rt        j                  | |      }n|dk(  rt        j                  | |
      }nn|dv rt        j                  | |
      }nR|dk(  rt        j                  | fddi|}n4|dk(  rt        j                  | fd|i|}nt        j                  | fi |}|dkD  r;|j                  }|j                         }	|g|	D 
cg c]  }
t        |
       c}
z   }|S |j                  S # t        $ ro}|dv rP	 t        j                  | |dk(  rdn|dk(  r|nd|dddddg      }n3# t        $ r}t        d|  d|       d }~ww xY wt        d|  d|       Y d }~d }~ww xY wc c}
w )N	zUsing custom delimiter: i'  zutf-8-lossyTr0   NV)n_rowsinfer_schema_lengthencodingignore_errorsnull_valuesz.parquet)ri   z.json)rj   z.ipc)z.xlsxz.xls.tsvr   .txt)z.csvrn   ro   ,zlatin-1)r   ri   rj   rk   rl   rm   z!Could not read header from file: z
Error: r   )r   suffixr   printdictplread_parquet	read_jsonread_ipc
read_excelread_csv	Exceptionr:   rM   re   list)rc   rd   re   extread_csv_kwargsrX   ee2headerobjectsrU   results               r-   get_file_headerr      s   
y/
 
 
&
&
(C 	$%5$6
78&Z %"T

 *48BG^iTBBF]Yt4B%%y6BF]YJ$J/JBF]YV2BVoVBY:/:B$ ax'')':3T#Y::::-  Z**_[[&)VmdSTZ]9I`c(-&"&!#T
  _ #DYKyY[X\!]^^_ @9UVTWXYY 	Z( ;sB   CE 3G	G!G&,FG	F2F--F22GGr_   c                 \    dj                  | j                         j                               S r\   )r   stripr^   )r_   s    r-   cleanupr      s     88DJJL&&())r.   c                    | sy g }d}t        | dd       r)|j                  | j                  j                                t        | dd       r,|j                  || j                  j                         z          t        | dd       r,|j                  || j
                  j                         z          t        | dd       r)|j                  | j                  j                                t        | dd       r<| j                  j                         }|j                  |       |j                  |       t        | dd       r/| j                  j                         }|j                  |gdz         t        | d	d       r)|j                  | j                  j                                t        | d
d       r)|j                  | j                  j                                t        dj                  |            S )Nz AND producer_keywordbase_keywordappellation_keywordcolor_keywordcommon_modifiers_keywordmodifiers_keywordrC   custom_not_keywordglobal_not_keywordr0   )rO   appendr   r   r   r   r   r   r   extendr   r   r   r   )wine_keywordpartsSTR_ANDvals       r-   join_patternr      s   EG|/6\2288:;|^T2W|88>>@@A|2D9W|??EEGGH|_d3\//5578|7>3399;SS|0$7,,224cUQY|148\44::<=|148\44::<=2775>""r.   )
   r0   _N)   )NNr>   )x   )Nr   )-base64csvior"   r5   r   pathlibr   typingr   r   pandasrP   polarsrt   r    fastapir   r   fastapi.responsesr	   r
   sqlalchemy.ormr   src.core.models.baser   src.utils.enumsr   src.utils.helpers.authr   r   intstrr)   r(   r<   rA   rE   rK   rZ   rb   r{   r   r   r   rH   r.   r-   <module>r      st    
 	          ) /  " & % .Kt,	  $%%9o% % 	%
 % :% 	%P
S# 
Sc 
S cg$$	?$8;d
$UX[_U_$$N&c 	 	c 	'
2s 2c 2 2TX 2n*# *# *
"##* "#r.   