o
    Vim                     @   s   d dl mZmZmZ d dlmZ d dlmZmZ d dl	m	Z	 d dl
Z
d dlZd dlZd dlZe	je e
jejejfdZdd Zd	d
 Zdd Zdd Zdd Zdd ZdddZdddZdd Zdd ZdS )    )Flaskrequestjsonify)closing)connect_to_databaseConfig)appN)authc              
   C   s  zd| vs	d| vrt d| dd }|dkrd}d}n|dks&|dkr+d}d	}n|d
kr4d}d}nd}d}|t|| dd| ddttt| d d | d d| dd| dddd}|d
krod|d d< tjd| t	j
|}tjd| |W S  tjjy } ztjdt| tjt   d}~w ty } ztjdt| tjt   d}~ww )zACreate a Razorpay plan with improved validation and debug loggingpricecurrency_codez5package_data must include 'price' and 'currency_code'billing_cyclemonthly   annualyearly   lifetimepackage_namezUnnamed Planpackage_description d   )namedescriptionamountcurrency
country_id
package_idnew)r   r   )periodintervalitemnotesi "r!   Z	expire_byz'Creating Razorpay plan with payload: %szRazorpay plan created: %szRazorpay BadRequestError: %sNz Error creating Razorpay plan: %s)
ValueErrorgetlowerintroundfloatr   loggerdebugrazorpay_clientplancreateinforazorpayerrorsBadRequestErrorerrorstr	traceback
format_exc	Exception)package_datar   r   r   Zplan_paramsrazorpay_planZbree r9   K/Users/harjaapdhillon/Desktop/newidea/medvista_backend/Services/Packages.pycreate_razorpay_plan   sV   



r;   c              
   C   s   zVt j| }|d d tt|d d kpH|d d |d kpH|d d |dd	kpH|d
 |d dkr8dndkpH|d |d dkrFdndk}|rTt|}|d W S | W S  tyn } ztj	
dt|   d}~ww )z)Helper function to update a Razorpay planr    r   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   idzError updating Razorpay plan: N)r*   r+   Zfetchr%   r'   r#   r;   r5   r   r(   r1   r2   )plan_idr6   Zexisting_planZcritical_changesZnew_planr8   r9   r9   r:   update_razorpay_planP   s(    
r>   c              
   C   s8   zW dS  t y } ztjdt|   d}~ww )z)Helper function to delete a Razorpay planTError deleting Razorpay plan: N)r5   r   r(   r1   r2   )r=   r8   r9   r9   r:   delete_razorpay_plann   s   r@   c                 C   s*  z|t |  k}|d|d f | }|r3tjd|d  d|d   |d W  d   W S d}|||d |d	|d |d d  |d
d|d f |   |j	}tjd|d  d|  |W  d   W S 1 suw   Y  W dS  t
y } ztjdt|   d}~ww )aO  
    Check if country exists in llx_c_country table, if not create it.
    Returns the country_id.
    
    country_data should contain:
    - country: Full name (e.g., "United States")
    - country_code: 2-letter code (e.g., "US")
    - country_iso: 3-letter ISO code (e.g., "USA")
    - numeric_code: 3-digit code (e.g., "840")
    z,SELECT id FROM llx_c_country WHERE code = %scountry_codezCountry country already exists with ID: r   Nz
                INSERT INTO llx_c_country (code, code_iso, numeric_code, label, eec, active, favorite)
                VALUES (%s, %s, %s, %s, 0, 1, 0)
            country_isonumeric_code000zCreated new country: 
 with ID: z Error in get_or_create_country: r   cursorexecutefetchoner   r(   r-   r#   commit	lastrowidr5   r1   r2   )
connectioncountry_datarI   rB   insert_queryr   r8   r9   r9   r:   get_or_create_countryy   s8    
(rQ   c              
   C   s
  zlt |  [}|d|d f | }|r3tjd|d  d|d   |d W  d   W S d}|||d |dd	f |   |j	}tjd
|d  d|  |W  d   W S 1 sew   Y  W dS  t
y } ztjdt|   d}~ww )z
    Check if currency exists in currencies table, if not create it.
    Returns the currency_id.
    
    currency_data should contain:
    - currency_code: 3-letter code (e.g., "USD")
    - currency_symbol: Symbol (e.g., "$")
    z2SELECT id FROM currencies WHERE currency_code = %sr   z	Currency rC   r   Nzu
                INSERT INTO currencies (currency_code, currency_symbol)
                VALUES (%s, %s)
            currency_symbolr   zCreated new currency: rG   z!Error in get_or_create_currency: rH   )rN   currency_datarI   r   rP   currency_idr8   r9   r9   r:   get_or_create_currency   s4   	 
(rU   c                  C   s  t  } g d}|D ] }|| vs| | d u s| | dkr*td| dddf  S q
g d}| d |vrDtd	d
| dddfS t }zz5| d | d | d| d | ddd}t||}| d | ddd}t||}t|	 }	d}
d }| d | d ||| d | d | ddd}|
szHt
|}|d }td td|  td| d   td| d   td|d  td|  td | d   td!|  W n ty } ztd"| d d#|   d }~ww g d$}| d | d ||| d |g}dd%d&d'd(}| D ]\}}|| v r-|| || |  qd
|}d
d)gt| }d*| d+| d,}|	|| |  |	j}|	d-|f |	 }d.d/ |	jD }tt||}W d    n	1 syw   Y  W nd ty } zW|  |
sd0t v rzt|d  td1|d  W n ty } ztd2|  W Y d }~nd }~ww td3t| ddd4fW  Y d }~W t| |  S d }~ww W t| |  n	t| |  w td5|d6d7d8fS )9N)r   r
   r   rB   rA   r   r   zMissing required field: truemessager1     )r   r   r   r   z'Invalid billing cycle. Must be one of: , rB   rA   rD   rE   rF   rB   rA   rD   rE   r   rR   r   rR   Fr   r
   r   r   r
   r   rT   r   r   r   r<   z#Razorpay plan created successfully:z  Razorpay Plan ID: z  Package Name: z	  Price: z  Currency: z  Country ID: z  Billing Cycle: z  Razorpay Plan Response: z'Error while creating Razorpay plan for z: )r   r
   r   rT   r   razorpay_plan_idmaximum_bookingsprice_after_max	is_active)r   r_   r`   ra   z%szINSERT INTO packages (z
) VALUES ()aP  
                SELECT p.*, c.label AS country_name, c.code AS country_code, 
                       cr.currency_code, cr.currency_symbol 
                FROM packages p
                JOIN llx_c_country c ON p.country_id = c.id
                JOIN currencies cr ON p.currency_id = cr.id
                WHERE p.id = %s
            c                 S      g | ]}|d  qS r   r9   .0descr9   r9   r:   
<listcomp>F      z"create_package.<locals>.<listcomp>r7   z=Rolled back Razorpay plan due to DB error. Razorpay Plan ID: z0Failed to delete Razorpay plan during rollback: zError creating package:   zPackage created successfullyfalserX   datar1      )r   get_jsonr   joinr   r#   rQ   rU   r   rI   r;   printr5   itemsappendlenrJ   rL   rM   rK   r   dictziprollbacklocalsr@   r2   export_db_schema_to_csvclose)rm   required_fieldsfieldZvalid_cyclesrN   rO   r   rS   rT   rI   Zis_freer^   r6   r7   Zrp_errfieldsvaluesZoptional_fieldsdb_field
fields_strplaceholdersqueryr   packagecolumn_namesr8   Zdel_errr9   r9   r:   create_package   s    







V(



r   db_schema.csvc              
   C   s  zrt |  Z}|d | }|r|d nd}|stdd}|||f | }t|dddd	}t|}|	g d
 |D ]}	|	|	 qCW d   n1 sUw   Y  W d   n1 sdw   Y  t
d|  |W S  ty }
 zt
d|
   d}
~
ww )a  Dump all tables and columns for the current database into a CSV file.

    CSV columns: table_schema, table_name, column_name, ordinal_position,
                 data_type, is_nullable, column_default, column_key, extra
    Returns the output_path on success.
    zSELECT DATABASE()r   Nz)Could not determine current database namea`  
                SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION,
                       COLUMN_TYPE, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT,
                       COLUMN_KEY, EXTRA
                FROM INFORMATION_SCHEMA.COLUMNS
                WHERE TABLE_SCHEMA = %s
                ORDER BY TABLE_NAME, ORDINAL_POSITION
            wr   zutf-8)modenewlineencoding)
Ztable_schemaZ
table_nameZcolumn_nameZordinal_positioncolumn_type	data_typeZis_nullableZcolumn_defaultZ
column_keyextrazDatabase schema exported to zFailed to export DB schema: )r   rI   rJ   rK   RuntimeErrorfetchallopencsvwriterwriterowrq   r5   )rN   Zoutput_pathrI   Zdb_rowZdb_namer   rowsZcsvfiler   rerrr9   r9   r:   ry   ]  s4   
	
ry   c              
      st  | d ur| nt j}t jd}t jd}t jd}|dp$|d}|dp.|d}|dp8|d}t jd}	t jjdd	td
}
t jjddtd
}t jjddd}t jjddd }t }zAzt| }d}d}g }g }|r|d || |r|d || |r|d || |r|d ||  |r|d ||  |d ur|d ||	 dk |	r|d ||	 |rdd
| }||7 }||7 }||| | d }h d}||vrtd| dd d!fW  d    W W |  S |d"vr5td#| dd d!fW  d    W W |  S |d$| d%| 7 }|d |
 }|d&7 }||
|g ||| | }d'd( |jD   fd)d(|D }W d    n	1 svw   Y  W n& ty } ztd*t| dd d+fW  Y d }~W |  S d }~ww W |  n|  w t||||
d,d-d.fS )/Nr<   r   rT   rA   r   ra   r   limit
   )defaulttypepager   order_by
created_at)r   sortDESCaP  
            SELECT 
                p.*, 
                c.label, 
                c.code,
                cr.currency_code,
                cr.currency_symbol
            FROM packages p
            JOIN llx_c_country c ON p.country_id = c.id
            JOIN currencies cr ON p.currency_id = cr.id
            WHERE 1=1
            z
            SELECT COUNT(*)
            FROM packages p
            JOIN llx_c_country c ON p.country_id = c.id
            JOIN currencies cr ON p.currency_id = cr.id
            WHERE 1=1
            z	p.id = %szp.country_id = %szp.currency_id = %szc.code = %szcr.currency_code = %szp.is_active = %srV   zp.billing_cycle = %sz AND r   >	   rT   r   
updated_atr   r<   r
   ra   r   r   zInvalid order_by column: rW   rY   )ASCr   zInvalid sort direction: z ORDER BY p. z LIMIT %s OFFSET %sc                 S   rc   rd   r9   re   r9   r9   r:   rh     ri   z get_packages.<locals>.<listcomp>c                    s   g | ]	}t t |qS r9   )ru   rv   )rf   pkgr   r9   r:   rh     s    zError fetching packages: rj   rk   )rm   total_recordsr   per_pager1      )r   argsr#   r%   upperr   r   rI   rs   r$   rp   rJ   rK   r   rz   extendr   r   r5   r2   )Zrequest_argskwargsr   r   r   rT   rA   r   ra   r   r   r   r   r   rN   rI   r   count_query
conditionsr~   condition_strr   valid_columnsoffsetZpackagesZpackages_datar8   r9   r   r:   get_packages  s   












[

[X(
r   c                     s   t    d} | stddddfS t }zzd v rAd v rA d  d  d d  d	d
d}t||}| d< d v rY d  ddd}t||}| d< t| f}|	d| f |
 }|stddddfW  d    W W |  S dd |jD }tt||}	|	d}
g }g }|	d |	d |	d |	d |	d |	d |	ddd}dddddddddd 	}| D ]\}}| v rP|dkr|	d! | f |
 }|std"dddf  W  d    W W |  S  | |d< n9|dkr;|	d# | f |
 }|s/td$dddf  W  d    W W |  S  | |d< |d% |d<  | ||< || d& | |  q|sjtd'dddfW  d    W W |  S |
rt fd(d)d*D rt|
|}||
kr|d+ || ||  d,d-| d.}|	|| |  |	d/| f |
 }d0d |jD }tt||}W d    n	1 sw   Y  W n* ty } z|  td1t| ddd2fW  Y d }~W |  S d }~ww W |  n|  w td3|d4d5d6fS )7Nr<   Package ID is requiredrV   rW   rY   rB   rA   rD   rE   rF   r[   r   r   rR   r   r\   rT   z
                SELECT p.*, c.code, cr.currency_code
                FROM packages p
                JOIN llx_c_country c ON p.country_id = c.id
                JOIN currencies cr ON p.currency_id = cr.id
                WHERE p.id = %s
            Package not found  c                 S   rc   rd   r9   re   r9   r9   r:   rh   3  ri   z"update_package.<locals>.<listcomp>r^   r   r
   r   r   r]   ra   r_   r`   )	r   r   r
   r   rT   ra   r   r_   r`   z0SELECT id, code FROM llx_c_country WHERE id = %szCountry not foundz6SELECT id, currency_code FROM currencies WHERE id = %szCurrency not foundr   z = %szNo fields to updatec                 3   s    | ]}| v V  qd S Nr9   )rf   r|   rm   r9   r:   	<genexpr>k  s    z!update_package.<locals>.<genexpr>)r   r
   r   r   zrazorpay_plan_id = %szUPDATE packages SET rZ   z WHERE id = %sa  
                SELECT p.*, c.label, c.code, cr.currency_code, cr.currency_symbol 
                FROM packages p
                JOIN llx_c_country c ON p.country_id = c.id
                JOIN currencies cr ON p.currency_id = cr.id
                WHERE p.id = %s
            c                 S   rc   rd   r9   re   r9   r9   r:   rh     ri   zError updating package: rj   zPackage updated successfullyrk   rl   r   )r   ro   r#   r   r   rQ   rU   r   rI   rJ   rK   rz   r   ru   rv   rr   rs   anyr>   rp   rL   r5   rw   r2   )r   rN   rO   r   rS   rT   rI   r   r   Zexisting_packager^   Zupdate_fieldsr~   r6   Zallowed_fieldsr|   r   rB   r   Znew_plan_idr   r8   r9   r   r:   update_package  s   





d




d

d
d




`(
r   c                  C   s  t  } | d}|stddddfS t }zzst| c}|d|f | }|sCtddddfW  d    W W |	  S |d	 }|d
|f |
  |r{z	tj|i  W n tyz } ztjdt|  W Y d }~nd }~ww W d    n1 sw   Y  W n) ty } z|  tdt| dddfW  Y d }~W |	  S d }~ww W |	  n|	  w tddddfS )Nr<   r   rV   rW   rY   z7SELECT id, razorpay_plan_id FROM packages WHERE id = %sr   r   r   z3UPDATE packages SET is_active = FALSE WHERE id = %sr?   zError deleting package: rj   z Package deactivated successfullyrk   r   )r   ro   r#   r   r   r   rI   rJ   rK   rz   rL   r*   r+   deleter5   r   r(   r1   r2   rw   )rm   r   rN   rI   r   r^   r8   r9   r9   r:   delete_package  sP   

"(
r   )r   r   )flaskr   r   r   
contextlibr   confr   r   r   r.   osr3   r   configfrom_objectClientRAZORPAY_KEY_IDRAZORPAY_KEY_SECRETr*   r;   r>   r@   rQ   rU   r   ry   r   r   r   r9   r9   r9   r:   <module>   s,    <.+ 

0z 