U
    pht#                     @   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
mZmZ d dlmZmZ d dlmZ d dlmZmZ d dlZeeZe Zed	d
eefeeedddZedeefeeedddZedeefeedddZdd Z edeefeeedddZ!dS )    )	APIRouterDependsHTTPException)Session)textand_)ListDictOptional)datetimetimezone)get_db)	DeveloperActivityRecordNz8/api/developer/{developer_id}/activities-without-project2   )developer_idlimitdbc                    s   z| td| |d }g }|D ]f}||j|j|j|j|jd dd|jr\|j	 nd|j
pfd|j|jt|j|j|j|jd
 q$|t|d	W S  tk
r } z$td
|  tdt|dW 5 d}~X Y nX dS )z/Get activities that don't have project assigneda  
            SELECT 
                id,
                application_name,
                window_title,
                duration,
                timestamp,
                category,
                url,
                file_path
            FROM activity_records
            WHERE developer_id = :dev_id
            AND (project_name IS NULL OR project_name = '')
            AND duration > 60  -- Only activities longer than 1 minute
            ORDER BY timestamp DESC
            LIMIT :limit
        )dev_idr   i  z.2fhNZOther)
idapplication_namewindow_titledurationZduration_formatted	timestampcategoryurl	file_pathZsuggested_project)
activitiestotalz%Error getting unassigned activities:   Zstatus_codeZdetail)executer   fetchallappendr   r   r   r   r   	isoformatr   r   r   suggest_project_namelen	Exceptionloggererrorr   str)r   r   r   r   Zunassigned_activitiesrowe r.   ./project_assignment_api.pyget_activities_without_project   s>    

r0   z,/api/developer/{developer_id}/assign-project)r   requestr   c              
      s   z|| dg }| dd }| dd}|s:tddd|sJtdd	d|td
| |||dj}|  d|||dW S  tk
r    Y nJ tk
r } z,|  t	
d|  tdt|dW 5 d}~X Y nX dS )z*Assign project name to multiple activitiesactivity_idsproject_name project_typeDevelopment  zNo activity IDs providedr!   Project name is requiredz
            UPDATE activity_records
            SET project_name = :project_name,
                project_type = :project_type
            WHERE developer_id = :dev_id
            AND id = ANY(:activity_ids)
        )r   r3   r5   r2   T)successupdated_countr3   r5   zError assigning project: r    N)getstripr   r"   r   rowcountcommitr(   rollbackr)   r*   r+   )r   r1   r   r2   r3   r5   updatedr-   r.   r.   r/   assign_project_to_activitiesK   s6    
rA   z1/api/developer/{developer_id}/project-suggestions)r   r   c           
   
      s   zr| tdd| i }g }|D ],\}}}}|||||rD| ndd q"ddddd	d
ddddg
}||dW S  tk
r }	 z$td|	  tdt	|	dW 5 d}	~	X Y nX dS )z-Get list of existing projects for suggestionsa  
            SELECT DISTINCT 
                project_name,
                project_type,
                COUNT(*) as usage_count,
                MAX(timestamp) as last_used
            FROM activity_records
            WHERE developer_id = :dev_id
            AND project_name IS NOT NULL
            GROUP BY project_name, project_type
            ORDER BY last_used DESC
            LIMIT 20
        r   N)nametypeZusage_count	last_usedr6   ZFrontendZBackendZMobileZDatabaseZDocumentationZMeetingZResearchZTestingZDevOps)Zexisting_projectsproject_typesz#Error getting project suggestions: r    r!   )
r"   r   r#   r$   r%   r(   r)   r*   r   r+   )
r   r   ZprojectsZsuggestionsZprojectZptypecountrD   rE   r-   r.   r.   r/   get_project_suggestions|   s>    
 
	rG   c                    s   ddl }| sdS  rHt fdddD rH|d| }|rH|d S |rdd	g}|D ]&}||||j}|rX|d
  S qX|rd|kr|d|}|r|d
S dS )z-Suggest a project name based on activity datar   Nc                 3   s   | ]}|   kV  qd S )N)lower).0Zideapp_namer.   r/   	<genexpr>   s     z'suggest_project_name.<locals>.<genexpr>)ZvscodeZcursorcodez9^(.+?)\s*-\s*(.+?)\s*-\s*(Visual Studio Code|Cursor|Code)   z(/([^/]+)/(src|app|lib|backend|frontend)/z,\\([^\\]+)\\(src|app|lib|backend|frontend)\\   z
github.comzgithub\.com/[^/]+/([^/\s]+))reanysearchgroupr<   
IGNORECASE)r   rK   r   r   rP   matchpatternspatternr.   rJ   r/   r&      s(    
r&   z1/api/developer/{developer_id}/bulk-assign-similarc              
      s^  z| di }| dd }| dd}|s:tdddd	g}| ||d
}| drl|d |d |d< | dr|d d|d  d|d< | dr|d d|d  d|d< dd| d}|t||j}	|  d|	||dW S  tk
r    Y nL t	k
rX }
 z,|
  td|
  tdt|
dW 5 d}
~
X Y nX dS )z9Assign project to all similar activities based on patternrW   r3   r4   r5   r6   r7   r8   r!   zdeveloper_id = :dev_id)r   r3   r5   r   zapplication_name = :app_namerK   Zwindow_title_containsz window_title LIKE :title_pattern%Ztitle_patternZfile_path_containszfile_path LIKE :path_patternZpath_patternz
            UPDATE activity_records
            SET project_name = :project_name,
                project_type = :project_type
            WHERE z AND zE
            AND (project_name IS NULL OR project_name = '')
        T)r9   r:   r3   rW   zError bulk assigning project: r    N)r;   r<   r   r$   joinr"   r   r=   r>   r(   r?   r)   r*   r+   )r   r1   r   rW   r3   r5   Zquery_partsparamsZupdate_queryr@   r-   r.   r.   r/   bulk_assign_similar_activities   sH    





r[   )"Zfastapir   r   r   Zsqlalchemy.ormr   Z
sqlalchemyr   r   typingr   r	   r
   r   r   Zdatabaser   Zmodelsr   r   ZloggingZ	getLogger__name__r)   Zrouterr;   r+   intr0   ZpostrA   rG   r&   r[   r.   r.   r.   r/   <module>   sL   
<08#