o
    LeiG                      @   s   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Zddl	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 eeZd	d
 Zejdddd ZdS )    N)load_dotenv)
celery_app   )load_settingscalculate_all_in_costcalculate_profit_and_margincalculate_min_listing_price)classify_seasonalityget_sells_period)clean_numeric_valuessanitize_col_namec              
   C   s   t jt jt jtdd}z"t|d}tj| |dd W d   W dS 1 s+w   Y  W dS  t	yM } zt
d|  W Y d}~dS d}~ww )z1Helper to write to the recalculation status file...zrecalc_status.jsonw   )indentNz"Error writing recalc status file: )ospathjoindirnameabspath__file__openjsondumpIOErrorloggererror)status_dataRECALC_STATUS_FILEfe r"   3/var/www/agentarbitrage/keepa_deals/recalculator.pyset_recalc_status   s    &r$   z*keepa_deals.recalculator.recalculate_dealsnamec            %      C   s  t   td} tjtjtjtdd}tddd t		 }zt
|}t
j|_| }ddd	d
dddddd	}|d dd | D }g }| D ]\}}	t|}
|
|v ri|d|
 d|	  qRtdd |D swtddd| d}|| dd | D }|  |stddd W dS t|}tdd | d!|d"d# t }g }t|D ]Q\}}d|d i}ztt|dd$d%d&d'd&}tt|d	d$d%d&d'd&}|d"krz|d"krz|d
}z|d(v rd)}n
tt|d'd&}|d"k rd)}W n ttfy   d)}Y nw |d}z|d(v r.d*}n
tt|d+d&}|d"k r?d*}W n ttfyN   d*}Y nw t|dd, d-k}t ||||||}t!||}|"||d. |d/ t#||d0 W n% ttt$fy } zt%j&d1|d  d2| d3d4 W Y d}~nd}~ww z"t'|dd&|dd&|dd&| d5}t(|}||d6< ||d7< W n" t)y } zt%j&d8|d  d2| d3d4 W Y d}~nd}~ww |t*| |d9 d: d"kr
tdd;|d9  d<| d=||d9 d# qt
|}| }d"}|D ]p} zHd>d? |  D }!|!s*W qd@d? |! D }"ddAd |"+ D }#| d |"dB< t%,dC| d  dD|"  |dE|# dF|" |d97 }W q t
j-y } zt%j&dG| ddH d2| d3d4 W Y d}~qd}~ww |.  |  t		 | }$t%/dI|$dJdK| dL tddM| dN| d=d W dS  t)y } zt%j&dO| d3d4 tdPdQ| d W Y d}~dS d}~ww )Rz
    Celery task to perform a database-only data refresh for all deals.
    This version is API-free and only recalculates business logic and seasonality.
    	XAI_TOKENr   zdeals.dbRunningz'Starting database-only recalculation...)statusmessageASINList_atNowFBA_PickPack_FeeReferral_Fee_PercentShipping_IncludedTitleCategories_SubManufacturer)	r+   zList atz	Price NowzFBA Pick&Pack FeezReferral Fee %zShipping Includedr1   zCategories - Subr3   zPRAGMA table_info(deals)c                 S   s   g | ]}|d  qS r%   r"   .0rowr"   r"   r#   
<listcomp>>       z%recalculate_deals.<locals>.<listcomp>"z" AS c                 s   s    | ]}d |v V  qdS )r+   Nr"   )r5   sr"   r"   r#   	<genexpr>F   s    z$recalculate_deals.<locals>.<genexpr>z5ASIN column not found in deals table, cannot proceed.zSELECT z, z FROM dealsc                 S   s   g | ]}t |qS r"   )dictr4   r"   r"   r#   r7   K   r8   	CompletedzNo deals to recalculate.NzFound z) deals. Applying latest business logic...r   )r)   r*   total_dealsprocessed_deals0$ ,)NNonerB   r   r@   z0.0g      @g      .@%noyesprofitmargin)All_in_CostProfitMarginMin_Listing_Pricez#Recalc (Biz Calcs): Error for ASIN z	. Error: T)exc_info)xai_api_keyDetailed_SeasonalitySellsz%Recalc (Seasonality): Error for ASIN r   2   zProcessing logic for /z deals.c                 S   s&   i | ]\}}|d ur|dkr||qS )Nr+   r"   r5   kvr"   r"   r#   
<dictcomp>   s   & z%recalculate_deals.<locals>.<dictcomp>c                 S   s   i | ]	\}}t ||qS r"   r   rT   r"   r"   r#   rW      s    c                 S   s   g | ]
}d | d| qS )r9   z" = :r"   )r5   colr"   r"   r#   r7      s    
ASIN_WHEREzUpdating ASIN z with: zUPDATE deals SET z WHERE ASIN = :ASIN_WHEREz,Recalculation: Failed to update DB for ASIN UNKNOWNzRecalculation finished in z.2fzs. Updated z rows.z.Database-only recalculation complete. Updated z of z,Recalculation task failed catastrophically: FailedzAn unexpected error occurred: )0r   r   getenvr   r   r   r   r   r$   timesqlite3connectRowrow_factorycursorexecutefetchallitemsr   appendany
ValueErrorcloselenbusiness_load_settings	enumeratefloatstrgetreplace	TypeErrorlowerr   r   updater   KeyErrorr   r   r	   r
   	Exceptionr   keysdebugErrorcommitinfo)%XAI_API_KEYDB_PATHtask_start_timeconnrb   required_columns_mapexisting_columnsselect_clausesoriginal_namealiassanitized_originalquerydeals_to_refreshr>   business_settingsall_rows_to_updatei	deal_datarow_updateslist_at_price	now_pricefba_fee_rawfba_feeref_fee_rawref_feeshipping_includedall_costprofit_marginr!   detailed_seasonsells_periodupdate_countr6   update_dictsanitized_update_dictset_clausestask_durationr"   r"   r#   recalculate_deals   s   
 


$$





*(*
0""r   )r   loggingr]   r   redotenvr   r   r^   business_calculationsr   rk   r   r   r   seasonality_classifierr	   r
   
processingr   db_utilsr   	getLogger__name__r   r$   taskr   r"   r"   r"   r#   <module>   s    

	