U
    s75im                     @   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  z
d| ksd| krt d| dd }|dkr>d}d}n4|dksN|dkrXd}d	}n|d
krjd}d}nd}d}|t|| dd| ddttt| d d | d d| dd| dddd}|d
krd|d d< tjd| t	j
|}tjd| |W S  tjjk
rX } z(tjdt| tjt   W 5 d}~X Y nH tk
r } z(tjdt| tjt   W 5 d}~X Y nX dS )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   //var/www/html/api-medvista/Services/Packages.pycreate_razorpay_plan   sP    



r;   c              
   C   s   zt j| }|d d tt|d d kp|d d |d kp|d d |dd	kp|d
 |d dkrpdndkp|d |d dkrdndk}|rt|}|d W S | W S W n: tk
r } ztj	
dt|   W 5 d}~X Y nX dS )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   sF   zW dS  t k
r@ } ztjdt|   W 5 d}~X Y nX dS )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*  zt |  }|d|d f | }|rdtjd|d  d|d   |d W  5 Q R  W S d}|||d |d|d |d d  |d	d
|d f |   |j	}tjd|d  d|  |W  5 Q R  W S Q R X W n< t
k
r$ } ztjdt|   W 5 d}~X Y nX dS )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   z
                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: N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   s0     
rQ   c              
   C   s
  zt |  }|d|d f | }|rdtjd|d  d|d   |d W  5 Q R  W S d}|||d |ddf |   |j	}tjd	|d  d
|  |W  5 Q R  W S Q R X W n< t
k
r } ztjdt|   W 5 d}~X Y nX dS )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   zu
                INSERT INTO currencies (currency_code, currency_symbol)
                VALUES (%s, %s)
            currency_symbolr   zCreated new currency: rG   z!Error in get_or_create_currency: NrH   )rN   currency_datarI   r   rP   currency_idr8   r9   r9   r:   get_or_create_currency   s,    	 
rU   c                  C   s  t  } ddddddg}|D ]@}|| ks@| | d ks@| | dkrtd| d	d
df  S qdddg}| d |krtdd| d	d
dfS t }z.zl| d | d | d| d | ddd}t||}| d | ddd}t	||}t
|  }	d}
d }| d | d ||| d | d | ddd}|
szt|}|d }td td|  td| d   td| d   td|d  td |  td!| d   td"|  W n@ tk
r } z td#| d d$|   W 5 d }~X Y nX ddd%d&dd'g}| d | d ||| d |g}dd(d)d*d+}| D ],\}}|| krR|| || |  qRd|}dd,gt| }d-| d.| d/}|	|| |  |	j}|	d0|f |	 }d1d2 |	jD }tt||}W 5 Q R X W n tk
r } z|  |
sd3t krz$t|d  td4|d  W n2 tk
r } ztd5|  W 5 d }~X Y nX td6t| d	d
d7f W Y W S d }~X Y nX W 5 t| |  X td8|d9d:d;fS )<Nr   r
   r   rB   rA   r   r   zMissing required field: truemessager1     r   r   r   z'Invalid billing cycle. Must be one of: , rD   rE   rF   rB   rA   rD   rE   rR   r   rR   Fr   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   rT   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   s   g | ]}|d  qS r   r9   .0descr9   r9   r:   
<listcomp>F  s     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   export_db_schema_to_csvcloser#   rQ   rU   r   rI   r;   printr5   itemsappendlenrJ   rL   rM   rK   r   dictziprollbacklocalsr@   r2   )rk   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     





    


 :
r   db_schema.csvc                 C   s  zt |  }|d | }|r.|d nd}|s>tdd}|||f | }t|dddd	B}t|}|	d
dddddddddg
 |D ]}	|	|	 qW 5 Q R X W 5 Q R X t
d|  |W S  tk
r  }
 zt
d|
   W 5 d}
~
X Y nX dS )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encodingZtable_schemaZ
table_nameZcolumn_nameZordinal_positioncolumn_typeZ	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:   ro   ]  s>    
	
        ro   c              
      sb  | d k	r| nt j}t jd}t jd}t jd}|dpH|d}|dp\|d}|dpp|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 }zpz t| }d}d}g }g }|r|	d |	| |r(|	d |	| |rB|	d |	| |r`|	d |	|  |r~|	d |	|  |d k	r|	d |	|
 dk |	r|	d |	|	 |rdd| }||7 }||7 }||| | d }ddddddddd h	}||krFtd!| dd"d#fW  5 Q R  W W  S |d$krztd%| dd"d#fW  5 Q R  W W S |d&| d'| 7 }|d |
 }|d(7 }||
|g ||| | }d)d* |jD   fd+d*|D }W 5 Q R X W nH tk
r: } z(td,t| dd"d-f W Y W S d }~X Y nX W 5 |  X t||||
d.d/d0fS )1Nr<   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   r   r
   
updated_atzInvalid order_by column: rW   rY   )ASCr   zInvalid sort direction: z ORDER BY p. z LIMIT %s OFFSET %sc                 S   s   g | ]}|d  qS rc   r9   rd   r9   r9   r:   rg     s     z get_packages.<locals>.<listcomp>c                    s   g | ]}t t |qS r9   )ru   rv   )re   pkgr   r9   r:   rg     s     zError fetching packages: rh   ri   )rk   total_recordsr   per_pager1      )r   argsr#   r%   upperr   rp   r   rI   rs   r$   rn   rJ   rK   r   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    











       
,
* :
r   c                     s  t    d} | s(tddddfS t }zzFd krd kr d  d  d d  d	d
d}t||}| d< d kr d  ddd}t||}| d< t|	 }|
d| f | }|stddddfW  5 Q R  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 ]\}}| kr|dkr|
d! | f | }|std"dddf  W  5 Q R  W W S  | |d< nl|dkrj|
d# | f | }|sRtd$dddf  W  5 Q R  W W S  | |d< |d% |d<  | ||< || d& | |  q|std'dddfW  5 Q R  W W S |
r
t fd(d)d*D r
t|
|}||
kr
|d+ || ||  d,d-| d.}|
|| |  |
d/| f | }d0d |jD }tt||}W 5 Q R X W nP tk
r } z0|  td1t| ddd2f W Y W S d }~X Y nX W 5 |  X 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   s   g | ]}|d  qS rc   r9   rd   r9   r9   r:   rg   3  s     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   | ]}| kV  qd S )Nr9   )re   rz   rk   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   s   g | ]}|d  qS rc   r9   rd   r9   r9   r:   rg     s     zError updating package: rh   zPackage updated successfullyri   rj   r   )r   rm   r#   r   r   rp   rQ   rU   r   rI   rJ   rK   r   ru   rv   rr   rs   anyr>   rn   rL   r5   rw   r2   )r   rN   rO   r   rS   rT   rI   r   r   Zexisting_packager^   Zupdate_fieldsr|   r6   Zallowed_fieldsrz   r}   rB   r   Znew_plan_idr   r8   r9   r   r:   update_package  s    




&



*
*&




:
r   c                  C   sl  t  } | d}|s(tddddfS t }zzt| }|d|f |	 }|stddddfW  5 Q R  W W S |d	 }|d
|f |
  |rztj|i  W n8 tk
r } ztjdt|  W 5 d }~X Y nX W 5 Q R X W nP tk
rJ } z0|  tdt| dddf W Y W S d }~X Y nX W 5 |  X 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: rh   z Package deactivated successfullyri   r   )r   rm   r#   r   r   rp   r   rI   rJ   rK   rL   r*   r+   deleter5   r   r(   r1   r2   rw   )rk   r   rN   rI   r   r^   r8   r9   r9   r:   delete_package  s:    
$6:
r   )r   )N)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   ro   r   r   r   r9   r9   r9   r:   <module>   s*   <.+ 
0
z 