o
    ì)i,H                     @   sf   d Z ddlZddlmZmZ ddlmZmZmZmZm	Z	 ddl
mZmZmZmZmZ G dd dZdS )	ze
Data Controller for the MAB Recommendation System.
Handles all ORM queries and database operations.
    N)datetime	timedelta)ListDictAnyOptionalTuple   )
FeedbackDBProductCatalogUserDemographicsSearchHistoryDatabaseManagerc                
   @   sh  e Zd ZdZdDdefddZdedefdd	ZdEde	de	de
eeef  fddZdEdede	de
eeef  fddZdFde	de
eeef  fddZdedefddZde	deeeef  fddZdGdede	de
eeef  fddZdGdede	de
eeef  fd d!ZdHde	de
eeef  fd#d$Zd%ede	fd&d'Zde	deeeef  fd(d)Zd*edeeeef  fd+d,Zde	d-e	defd.d/Zd-e	de
eeef  fd0d1Zd2edefd3d4ZdGde	de	de
eeef  fd5d6Zde	deeef fd7d8Z dedeeef fd9d:Z!dEde	de
eeef  fd;d<Z"de	fd=d>Z#de	fd?d@Z$de	fdAdBZ%dCS )IDataControllerz0Handles all database operations and ORM queries.recommender_system.dbdb_pathc                 C   s   t || _| j  d S )N)r   
db_managerinit_database)selfr    r   _/Users/divyeshpatel/Desktop/sahana/Recommender/recommender_rl/recommender/db/data_controller.py__init__   s   
zDataController.__init__feedbackreturnc              
   C   s   z5| j '}| }|d|j|j|j|j|jf |  |	  	 W d   W dS 1 s.w   Y  W dS  t
yO } ztd|  W Y d}~dS d}~ww )z"Add user feedback to the database.z
                    INSERT INTO feedback_db (user_id, product_id, event_type, session, active_user)
                    VALUES (?, ?, ?, ?, ?)
                NTu   ❌ Error adding feedback: F)r   cursorexecuteuser_id
product_id
event_typesessionactive_usercommitclose	Exceptionprint)r   r   connr   er   r   r   add_feedback   s"   (zDataController.add_feedbackd   r   limitc              
   C      z5| j '}| }|d||f g }| D ]	}|t| q|W  d   W S 1 s.w   Y  W dS  tyP } ztd|  g W  Y d}~S d}~ww )z)Get feedback history for a specific user.aD  
                    SELECT f.*, p.product_name, p.brand_name, p.category, p.price
                    FROM feedback_db f
                    JOIN product_catalog p ON f.product_id = p.product_id
                    WHERE f.user_id = ?
                    ORDER BY f.session DESC
                    LIMIT ?
                Nu!   ❌ Error getting user feedback: r   r   r   fetchallappenddictr#   r$   r   r   r)   r%   r   resultsrowr&   r   r   r   get_user_feedback+       	(z DataController.get_user_feedbackr   c              
   C   r*   )z,Get feedback history for a specific product.a%  
                    SELECT f.*, u.name as user_name
                    FROM feedback_db f
                    JOIN user_demographics u ON f.user_id = u.user_id
                    WHERE f.product_id = ?
                    ORDER BY f.session DESC
                    LIMIT ?
                Nu$   ❌ Error getting product feedback: r+   )r   r   r)   r%   r   r0   r1   r&   r   r   r   get_product_feedbackA   r3   z#DataController.get_product_feedback   hoursc              
   C   s   z=| j /}| }t t|d }|d|f g }| D ]	}|t| q|W  d   W S 1 s6w   Y  W dS  t	yX } zt
d|  g W  Y d}~S d}~ww )z+Get recent feedback within specified hours.)r6   aa  
                    SELECT f.*, p.product_name, u.name as user_name
                    FROM feedback_db f
                    JOIN product_catalog p ON f.product_id = p.product_id
                    JOIN user_demographics u ON f.user_id = u.user_id
                    WHERE f.session >= ?
                    ORDER BY f.session DESC
                Nu#   ❌ Error getting recent feedback: )r   r   r   nowr   r   r,   r-   r.   r#   r$   )r   r6   r%   r   Zcutoff_timer0   r1   r&   r   r   r   get_recent_feedbackW   s"   	(z"DataController.get_recent_feedbackproductc                 C   s   z5| j '}| }|d|j|j|j|j|j|j|j	f |
  	 W d   W dS 1 s.w   Y  W dS  tyO } ztd|  W Y d}~dS d}~ww )z!Add a new product to the catalog.z
                    INSERT OR REPLACE INTO product_catalog 
                    (product_id, product_name, brand_name, category, price, description, image_url)
                    VALUES (?, ?, ?, ?, ?, ?, ?)
                NTu   ❌ Error adding product: F)r   r   r   r   product_name
brand_namecategorypricedescription	image_urlr!   r#   r$   )r   r9   r%   r   r&   r   r   r   add_productp   s    (zDataController.add_productc              
   C      z.| j  }| }|d|f | }|rt|ndW  d   W S 1 s'w   Y  W dS  tyH } ztd|  W Y d}~dS d}~ww )zGet product details by ID.zX
                    SELECT * FROM product_catalog WHERE product_id = ?
                Nu   ❌ Error getting product: r   r   r   fetchoner.   r#   r$   )r   r   r%   r   r1   r&   r   r   r   get_product      (zDataController.get_product2   r<   c              
   C   r*   )zGet products by category.z
                    SELECT * FROM product_catalog 
                    WHERE category = ? 
                    ORDER BY product_id 
                    LIMIT ?
                Nu(   ❌ Error getting products by category: r+   )r   r<   r)   r%   r   r0   r1   r&   r   r   r   get_products_by_category       (z'DataController.get_products_by_categorybrandc              
   C   r*   )zGet products by brand.z
                    SELECT * FROM product_catalog 
                    WHERE brand_name = ? 
                    ORDER BY product_id 
                    LIMIT ?
                Nu%   ❌ Error getting products by brand: r+   )r   rI   r)   r%   r   r0   r1   r&   r   r   r   get_products_by_brand   rH   z$DataController.get_products_by_brand  c              
   C      z4| j &}| }|d|f g }| D ]	}|t| q|W  d   W S 1 s-w   Y  W dS  tyO } ztd|  g W  Y d}~S d}~ww )z!Get all products with pagination.z
                    SELECT * FROM product_catalog 
                    ORDER BY product_id 
                    LIMIT ?
                Nu    ❌ Error getting all products: r+   r   r)   r%   r   r0   r1   r&   r   r   r   get_all_products       (zDataController.get_all_productsuserc              
   C   s   z2| j $}| }|d|j|j|j|jf |j}|  |W  d   W S 1 s+w   Y  W dS  t	yL } zt
d|  W Y d}~dS d}~ww )z&Add a new user and return the user ID.z
                    INSERT INTO user_demographics (name, gender, age, user_cluster_id)
                    VALUES (?, ?, ?, ?)
                Nu   ❌ Error adding user: )r   r   r   namegenderageuser_cluster_id	lastrowidr!   r#   r$   )r   rP   r%   r   r   r&   r   r   r   add_user   s   (
zDataController.add_userc              
   C   rA   )zGet user details by ID.zW
                    SELECT * FROM user_demographics WHERE user_id = ?
                Nu   ❌ Error getting user: rB   )r   r   r%   r   r1   r&   r   r   r   get_user   rE   zDataController.get_userrR   c              
   C   rA   )z?Lookup a user by name (used when importing external customers).zX
                    SELECT * FROM user_demographics WHERE name = ?
                    Nu    ❌ Error getting user by name: rB   )r   rR   r%   r   r1   r&   r   r   r   get_user_by_name   s   (
zDataController.get_user_by_name
cluster_idc              
   C   s   z)| j }| }|d||f |  	 W d   W dS 1 s"w   Y  W dS  tyC } ztd|  W Y d}~dS d}~ww )z!Update user's cluster assignment.z
                    UPDATE user_demographics 
                    SET user_cluster_id = ?, last_active = CURRENT_TIMESTAMP
                    WHERE user_id = ?
                NTu!   ❌ Error updating user cluster: F)r   r   r   r!   r#   r$   )r   r   rZ   r%   r   r&   r   r   r   update_user_cluster   s   (	z"DataController.update_user_clusterc              
   C   rL   )z$Get all users in a specific cluster.z
                    SELECT * FROM user_demographics 
                    WHERE user_cluster_id = ?
                    ORDER BY user_id
                Nu$   ❌ Error getting users by cluster: r+   )r   rZ   r%   r   r0   r1   r&   r   r   r   get_users_by_cluster  rO   z#DataController.get_users_by_clustersearchc              
   C   s   z/| j !}| }|d|j|j|j|jf |  	 W d   W dS 1 s(w   Y  W dS  tyI } zt	d|  W Y d}~dS d}~ww )zAdd search history entry.z
                    INSERT INTO search_history (user_id, query, product_id, session_id)
                    VALUES (?, ?, ?, ?)
                NTu!   ❌ Error adding search history: F)
r   r   r   r   queryr   
session_idr!   r#   r$   )r   r]   r%   r   r&   r   r   r   add_search_history%  s   (z!DataController.add_search_historyc              
   C   r*   )z'Get search history for a specific user.z
                    SELECT * FROM search_history 
                    WHERE user_id = ? 
                    ORDER BY timestamp DESC 
                    LIMIT ?
                Nu'   ❌ Error getting user search history: r+   r/   r   r   r   get_user_search_history4  rH   z&DataController.get_user_search_historyc           	   
   C   s   z`| j R}| }|d|f | }|d|f dd | D }|d|f | d }|d|f dd	 | D }|rGt|nd
|||dW  d
   W S 1 sYw   Y  W d
S  ty{ } ztd|  i W  Y d
}~S d
}~ww )z(Get comprehensive user behavior summary.z1SELECT * FROM user_demographics WHERE user_id = ?z
                    SELECT event_type, COUNT(*) as count
                    FROM feedback_db 
                    WHERE user_id = ?
                    GROUP BY event_type
                c                 S      i | ]	}|d  |d qS r   countr   .0r1   r   r   r   
<dictcomp>[      z<DataController.get_user_behavior_summary.<locals>.<dictcomp>z
                    SELECT COUNT(*) as recent_count
                    FROM feedback_db 
                    WHERE user_id = ? AND session >= datetime('now', '-7 days')
                Zrecent_countaO  
                    SELECT p.category, COUNT(*) as count
                    FROM feedback_db f
                    JOIN product_catalog p ON f.product_id = p.product_id
                    WHERE f.user_id = ?
                    GROUP BY p.category
                    ORDER BY count DESC
                    LIMIT 5
                c                 S   s   g | ]}t |qS r   )r.   re   r   r   r   
<listcomp>o  s    z<DataController.get_user_behavior_summary.<locals>.<listcomp>N)	user_infoevent_countsrecent_activityfavorite_categoriesu)   ❌ Error getting user behavior summary: r   r   r   rC   r,   r.   r#   r$   )	r   r   r%   r   rj   rk   rl   rm   r&   r   r   r   get_user_behavior_summaryJ  s8   	(*z(DataController.get_user_behavior_summaryc              
   C   s   zO| j A}| }|d|f | }|d|f dd | D }|d|f | d }|r7t|nd||dW  d   W S 1 sHw   Y  W dS  tyj } ztd	|  i W  Y d}~S d}~ww )
z Get product performance metrics.z2SELECT * FROM product_catalog WHERE product_id = ?z
                    SELECT event_type, COUNT(*) as count
                    FROM feedback_db 
                    WHERE product_id = ?
                    GROUP BY event_type
                c                 S   rb   rc   r   re   r   r   r   rg     rh   z:DataController.get_product_performance.<locals>.<dictcomp>z
                    SELECT COUNT(DISTINCT user_id) as unique_users
                    FROM feedback_db 
                    WHERE product_id = ?
                unique_usersN)product_infork   rp   u'   ❌ Error getting product performance: rn   )r   r   r%   r   rq   rk   rp   r&   r   r   r   get_product_performance{  s.   (z&DataController.get_product_performancec              
   C   rL   )z Get all users from the database.z
                    SELECT * FROM user_demographics 
                    ORDER BY user_id ASC
                    LIMIT ?
                Nu   ❌ Error getting all users: r+   rM   r   r   r   get_all_users  rO   zDataController.get_all_usersc              
   C      z,| j }| }|d | }|r|d ndW  d   W S 1 s%w   Y  W dS  tyF } ztd|  W Y d}~dS d}~ww )z%Get total number of feedback records.z)SELECT COUNT(*) as count FROM feedback_dbrd   r   Nu(   ❌ Error getting total feedback count: r   r   r   rC   r#   r$   r   r%   r   resultr&   r   r   r   get_total_feedback     
(z!DataController.get_total_feedbackc              
   C   rt   )zGet total number of users.z/SELECT COUNT(*) as count FROM user_demographicsrd   r   Nu   ❌ Error getting user count: ru   rv   r   r   r   get_user_count  ry   zDataController.get_user_countc              
   C   rt   )zGet total number of products.z-SELECT COUNT(*) as count FROM product_catalogrd   r   Nu!   ❌ Error getting product count: ru   rv   r   r   r   get_product_count  ry   z DataController.get_product_countN)r   )r(   )r5   )rF   )rK   )&__name__
__module____qualname____doc__strr   r
   boolr'   intr   r   r   r2   r4   r8   r   r@   r   rD   rG   rJ   rN   r   rW   rX   rY   r[   r\   r   r`   ra   ro   rr   rs   rx   rz   r{   r   r   r   r   r      s2    $$ $$ $1 $r   )r   sqlite3r   r   typingr   r   r   r   r   modelsr
   r   r   r   r   r   r   r   r   r   <module>   s    