o
    “èjc<  ã                   @   sl   d Z ddlmZmZm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 G dd	„ d	e	ƒZd
S )zV
Prophet Controller
Handles API endpoints for Facebook Prophet forecasting operations
é    )ÚDictÚAnyÚOptional)ÚrequestÚg)ÚBaseController)ÚProphetService)ÚOMSDataService)Ú
get_loggerc                       s  e Zd ZdZ‡ fdd„Zdeeef defdd„Z	ded	eeef defd
d„Z
ded	eeef defdd„Zdedefdd„Zdefdd„Zdedefdd„Zdeeef defdd„Zdeeef defdd„Zded	eeef defdd„Zdefdd„Zdedefdd„Z‡  ZS )ÚProphetControllerz-Controller for Prophet forecasting operationsc                    s(   t ƒ  ¡  tƒ | _tƒ | _tdƒ| _d S )NÚprophet_controller)ÚsuperÚ__init__r   Úprophet_servicer	   Úoms_data_servicer
   Úlogger)Úself©Ú	__class__© ú@/var/www/html/oms-prod-mcp/app/controllers/prophet_controller.pyr      s   
zProphetController.__init__ÚdataÚreturnc           
   
   C   s  zHt |dƒr
| ¡ }|  |dg¡}|r|W S |d }| d¡}| d¡p%i }| j |¡\}}|s9|  d|dœ¡W S | jj|||d}|  |d¡W S  t	yc }	 z|  d	t
|	ƒi¡W  Y d
}	~	S d
}	~	w ty‹ }	 z| jjdt
|	ƒ› dd |  dt
|	ƒdœ¡W  Y d
}	~	S d
}	~	ww )z´
        Train a Prophet model

        Args:
            data: Request data containing time series data and configuration

        Returns:
            API response tuple
        Ú
model_dumpr   Úmodel_idÚconfigúInvalid data format©ÚmessageÚerror©r   r   r   zModel trained successfullyr   NzError training model: T©Úexc_infozFailed to train model)Úhasattrr   Úvalidate_required_paramsÚgetr   Úvalidate_data_formatÚbad_requestÚtrain_modelÚcreatedÚ
ValueErrorÚstrÚ	Exceptionr   r   Úserver_error)
r   r   Úvalidation_errorÚtime_series_datar   r   Úis_validÚ	error_msgÚresultÚer   r   r   r(      s4   


ý€ €þzProphetController.train_modelr   Úparamsc           	   
   C   s6  zWt |dƒr
| ¡ }| dd¡}| dd¡}| dd¡}t|tƒr)|dk s)|d	kr1|  d
di¡W S g d¢}||vrG|  d
dd |¡› i¡W S | jj||||d}|  	|d¡W S  t
yr } z|  d
t|ƒi¡W  Y d}~S d}~w tyš } z| jjdt|ƒ› dd |  dt|ƒdœ¡W  Y d}~S d}~ww )zÍ
        Generate forecast for a trained model

        Args:
            model_id: ID of the trained model
            params: Forecast parameters

        Returns:
            API response tuple
        r   Úperiodsé   ÚfreqÚDÚinclude_historyTé   ém  r   ú,Periods must be an integer between 1 and 365)
r8   ÚHÚWÚMÚMEÚQÚQEÚYÚYEÚAz#Invalid frequency. Must be one of: z, )r   r5   r7   r9   zForecast generated successfullyNzError generating forecast: r!   zFailed to generate forecastr   )r#   r   r%   Ú
isinstanceÚintr'   Újoinr   Úgenerate_forecastÚokr*   r+   r,   r   r   r-   )	r   r   r4   r5   r7   r9   Úvalid_freqsr2   r3   r   r   r   rI   B   s8   
ÿü€ €þz#ProphetController.generate_forecastc           	   
   C   sp  ztt |dƒr
| ¡ }| dd¡}| dd¡}| dd¡}| dd	¡}t|tƒr/|d
k s/|dkr7|  ddi¡W S t|tƒrD|dk sD|dkrL|  ddi¡W S t|tƒrY|dk sY|dkra|  ddi¡W S | jj|||||d}|  d|id¡W S  t	y } z|  dt
|ƒi¡W  Y d}~S d}~w ty· } z| jjdt
|ƒ› dd |  dt
|ƒdœ¡W  Y d}~S d}~ww )zÎ
        Generate forecast plot for a trained model

        Args:
            model_id: ID of the trained model
            params: Plot parameters

        Returns:
            API response tuple
        r   r5   r6   r7   r8   Úwidthi   ÚheightiX  r:   r;   r   r<   i  iÐ  z-Width must be an integer between 400 and 2000i,  iÜ  z.Height must be an integer between 300 and 1500)r   r5   r7   rL   rM   ÚplotzPlot generated successfullyNzError generating plot: Tr!   zFailed to generate plotr   )r#   r   r%   rF   rG   r'   r   Úgenerate_plotrJ   r*   r+   r,   r   r   r-   )	r   r   r4   r5   r7   rL   rM   Ú	plot_datar3   r   r   r   Úget_forecast_plotp   s:   
û€ €þz#ProphetController.get_forecast_plotc              
   C   sŽ   z| j  |¡}|du r|  dd|› di¡W S |  |d¡W S  tyF } z| jjdt|ƒ› dd |  d	t|ƒd
œ¡W  Y d}~S d}~ww )z
        Get information about a trained model

        Args:
            model_id: ID of the model

        Returns:
            API response tuple
        Nr   úModel ú
 not foundz(Model information retrieved successfullyzError getting model info: Tr!   zFailed to get model informationr   )	r   Úget_model_infoÚ	not_foundrJ   r,   r   r   r+   r-   )r   r   Ú
model_infor3   r   r   r   rT   Ÿ   s   
 €þz ProphetController.get_model_infoc              
   C   sv   z| j  ¡ }|  |t|ƒdœd¡W S  ty: } z| jjdt|ƒ› dd |  dt|ƒdœ¡W  Y d}~S d}~ww )	zZ
        List all trained models

        Returns:
            API response tuple
        )ÚmodelsÚcountzModels listed successfullyzError listing models: Tr!   zFailed to list modelsr   N)	r   Úlist_modelsrJ   Úlenr,   r   r   r+   r-   )r   rW   r3   r   r   r   rY   µ   s   
 €þzProphetController.list_modelsc              
   C   sŽ   z| j  |¡}|s|  dd|› di¡W S |  d|id¡W S  tyF } z| jjdt|ƒ› dd |  d	t|ƒd
œ¡W  Y d}~S d}~ww )z˜
        Delete a trained model

        Args:
            model_id: ID of the model to delete

        Returns:
            API response tuple
        r   rR   rS   r   zModel deleted successfullyzError deleting model: Tr!   zFailed to delete modelr   N)	r   Údelete_modelrU   rJ   r,   r   r   r+   r-   )r   r   Údeletedr3   r   r   r   r[   Ä   s   
 €þzProphetController.delete_modelc           
   
   C   sf  z‰t |dƒr
| ¡ }|  |dg¡}|r|W S |d }| j |¡\}}||r)t|ƒnddœ}|s9||d< |  |¡W S z@ddl}| |¡}| 	|d ¡|d< |j
|d d	d
|d< |d  ¡  d¡|d  ¡  d¡dœ|d< t|d  ¡  ¡ ƒ|d< W n	 ty‚   Y nw |  |d¡W S  ty² }	 z| jjdt|	ƒ› dd |  dt|	ƒdœ¡W  Y d}	~	S d}	~	ww )z­
        Validate time series data format

        Args:
            data: Request data containing time series data

        Returns:
            API response tuple
        r   r   r   )ÚvalidÚdata_pointsr   NÚdsÚyÚcoerce)Úerrorsz%Y-%m-%d)ÚstartÚendÚ
date_rangeÚmissing_valueszData validation successfulzError validating data: Tr!   zFailed to validate datar   )r#   r   r$   r   r&   rZ   r'   ÚpandasÚ	DataFrameÚto_datetimeÚ
to_numericÚminÚstrftimeÚmaxrG   ÚisnaÚsumr,   rJ   r   r   r+   r-   )
r   r   r.   r/   r0   r1   r2   ÚpdÚdfr3   r   r   r   Úvalidate_dataÚ   s@   

þ

þÿ €þzProphetController.validate_datac              
   C   sn  zs|   |dg¡}|r|W S |d }| d¡}| d¡}| dd¡}| di ¡}| d¡}| di ¡}	| jj|||||d	}
|
sG|  d
di¡W S | j |
¡\}}|sZ|  d|dœ¡W S | jj|
||	d}|||||dœ|d< |  |d¡W S  t	yŽ } z|  d
t
|ƒi¡W  Y d}~S d}~w ty¶ } z| jjdt
|ƒ› dd |  dt
|ƒdœ¡W  Y d}~S d}~ww )zÂ
        Train a Prophet model using data from OMS database

        Args:
            data: Request data containing table configuration

        Returns:
            API response tuple
        Ú	table_keyÚ
start_dateÚend_dateÚaggregationÚdailyÚfiltersr   r   )rs   rt   ru   rx   rv   r   z(No data found for the specified criteriar   r   r    )rs   rt   ru   rv   rx   Údata_sourcez(Model trained from database successfullyNz$Error training model from database: Tr!   z#Failed to train model from database)r$   r%   r   Úget_time_series_datar'   r   r&   r(   r)   r*   r+   r,   r   r   r-   )r   r   r.   rs   rt   ru   rv   rx   r   r   r/   r0   r1   r2   r3   r   r   r   Útrain_from_database  sV   



ûý
û€ €þz%ProphetController.train_from_databasers   c              
   C   s   z<|  dd¡}|  d¡}|  d¡}t|tƒr|dk s|dkr&|  ddi¡W S | jj||||d	}|  ||t|ƒd
œd¡W S  tyW } z|  dt	|ƒi¡W  Y d}~S d}~w t
y } z| jjdt	|ƒ› dd |  dt	|ƒdœ¡W  Y d}~S d}~ww )z×
        Get a preview of time series data from database

        Args:
            table_key: Table configuration key
            params: Preview parameters

        Returns:
            API response tuple
        Úlimité
   rt   ru   r:   éd   r   z*Limit must be an integer between 1 and 100)rs   r|   rt   ru   )rs   Úpreview_datarX   z#Data preview retrieved successfullyNzError getting data preview: Tr!   zFailed to get data previewr   )r%   rF   rG   r'   r   Úget_data_previewrJ   rZ   r*   r+   r,   r   r   r-   )r   rs   r4   r|   rt   ru   r   r3   r   r   r   r€   O  s6   

üýü€ €þz"ProphetController.get_data_previewc              
   C   s˜   z"| j  ¡ }i }|D ]}| j  |¡}|r|||< q
|  ||dœd¡W S  tyK } z| jjdt|ƒ› dd |  dt|ƒdœ¡W  Y d}~S d}~ww )	z|
        Get list of available OMS tables for time series analysis

        Returns:
            API response tuple
        )ÚtablesÚ
table_infoz'Available tables retrieved successfullyz Error getting available tables: Tr!   zFailed to get available tablesr   N)	r   Úget_available_tablesÚget_table_inforJ   r,   r   r   r+   r-   )r   r   r‚   rs   Úinfor3   r   r   r   rƒ   w  s&   
€þý €þz&ProphetController.get_available_tablesc              
   C   s”   z | j  |¡\}}||dœ}|s||d< |  |¡W S |  |d¡W S  tyI } z| jjdt|ƒ› dd |  dt|ƒdœ¡W  Y d	}~S d	}~ww )
zŸ
        Validate a table configuration

        Args:
            table_key: Table configuration key

        Returns:
            API response tuple
        )rs   r0   r   zTable configuration is validzError validating table config: Tr!   z&Failed to validate table configurationr   N)	r   Úvalidate_table_configr'   rJ   r,   r   r   r+   r-   )r   rs   r0   r1   r2   r3   r   r   r   r†     s   
þ €þz'ProphetController.validate_table_config)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r+   r   Útupler(   rI   rQ   rT   rY   r[   rr   r{   r€   rƒ   r†   Ú__classcell__r   r   r   r   r      s    +./5@(r   N)rŠ   Útypingr   r   r   Úflaskr   r   Úapp.controllers.base_controllerr   Úapp.services.prophet_servicer   Úapp.services.oms_data_servicer	   Úapp.utils.helpersr
   r   r   r   r   r   Ú<module>   s    