
    {i
                     "   d Z ddlZddlZddlZddlmZ ddl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ZddlmZ  ed	e
      ZddededefdZdefdZdefdZddedefdZddededefdZd dedefdZ	 d!dedee   dededef
dZy)"z(
Utility functions for the application.
    N)Optional)Session)select)TypeAnyTypeVar)Base)slugify	ModelType)boundprependlengthreturnc                     t         j                  t         j                  z   dj                  fdt	        |      D              }| r|  d| S |S )z
    Generate a secure random ID with optional prefix.
    
    Args:
        prepend: String to prepend to the ID
        length: Length of the random part
        
    Returns:
        Secure random ID string
     c              3   H   K   | ]  }t        j                          y w)N)secretschoice).0_alphabets     V/var/www/html/hwPaymentPortal-be-dev/hw-payment-portal-api/src/core/utils/functions.py	<genexpr>z%generate_secure_id.<locals>.<genexpr>    s     Jq'..2Js   "r   )stringascii_lettersdigitsjoinrange)r   r   random_partr   s      @r   generate_secure_idr       sK     ##fmm3H''JE&MJJK!K=))    c                  <    t        t        j                               S )zI
    Generate a UUID4 string.
    
    Returns:
        UUID4 string
    struuiduuid4 r!   r   generate_uuidr(   '   s     tzz|r!   c                  B    t        t        j                               dd S )zs
    Generate a shorter UUID string (first 8 characters of UUID4).
    
    Returns:
        Short UUID string
    N   r#   r'   r!   r   generate_short_uuidr+   1   s     tzz|Ra  r!   decimalsc                 `    t        | d|z  z  dz         d|z  z  }|dz  dk(  rt        |      }|S )zJ
    This function rounds a number half up. Eg. 18.5 will round to 19
    
   g      ?   r   )int)numberr,   rounded_values      r   round_half_upr3   ;   sB     "h,/#56"h,GMqAM*r!   val	precisionc                 \    dj                  |      }	 |j                  | dz        S #  Y yxY w)Nz
{{:,.{}f}}d   0)format)r4   r5   formatted_amounts      r   format_amountr;   E   s7    #**95&&sSy11s   ' +sizec                     dj                  t        j                  t        j                  t        j
                  z   |             S )z0
    Generate a random string of given size
    r   )k)r   randomchoicesr   ascii_uppercaser   r<   s    r   random_string_generatorrC   L   s-     776>>&"8"86=="HDQRRr!   dbinstance
slug_labelnew_slugc                     ||}nt        |      }| j                  |      j                  |j                  |k(        j	                         }|r,dj                  |t        d            }t        | ||d      S |S )zq
    This is for a FastAPI project and it assumes your instance
    is a model, sand generates a unique slug
    Nz{slug}-{randstr}   rB   )slugrandstr)rD   rE   rG   rF   )r
   queryfilterrJ   firstr9   rC   generate_unique_slug)rD   rE   rF   rG   rJ   	qs_existss         r   rO   rO   S   s     z" "))(--4*?@FFHI%,,6A> - 
 $HxD
 	
 Kr!   )r      )r   )   )   )NN)__doc__r%   r   r   typingr   resqlalchemy.ormr   
sqlalchemyr   r   r   r   src.apps.base.modelsr	   r?   r
   r   r$   r0   r    r(   r+   r3   floatr;   rC   rO   r'   r!   r   <module>r[      s        	 "  $ $ %  Kt,	 # s (s !S !C  u  S S# Sc S UY	?8;NQr!   