U
    h?&                  	   @   s4  d dl mZmZmZmZ d dlmZ d dlmZ d dlZd dl	Z	d dl
mZ e	jejejeje d dlmZ e  eeddd	Zee ed
deeddeddeddedddZed sed ed eeZeddd Zeddd Zeddd  Zed!d"d# Zed$d%d& Zed'd(d) Z ed*kr0eed+d,Z!ed-d." d/kZ#ed0e! d1 ed2e!  ed3e#  ed4ed5  d6ed7  d8ed9   ed: ed;e! d ed<e! d$ ed=e! d! ed> ej$e#e!d?d@ dS )A    )Flaskjsonifyrequestrender_template)CORS)datetimeN)load_dotenv)ActivityAnalyzerz../frontend/templatesz../frontend/static)Ztemplate_folderZstatic_folderZDB_HOSTZ	localhostZDB_PORTi8  ZDB_NAMEZtimesheet_dbZDB_USERZpostgresZDB_PASSWORD )hostportdatabaseuserpasswordr   z>WARNING: Database password not found in environment variables!z8Please create a .env file with DB_PASSWORD=your_password/c                   C   s   t dS )Nzdashboard.html)r    r   r   ./dashboard_api_fixed.pyindex%   s    r   z"/api/dashboard/<path:developer_id>c              
   C   s   t | } tjd}|rTzt|d }W qX tk
rP   tddidf Y S X nd}zt	
| |}t|W S  tk
r } z@td|  d|  d	dl}|  tdt |id
f W Y S d}~X Y nX dS )z+Get dashboard data for a specific developerdatez%Y-%m-%derrorz#Invalid date format. Use YYYY-MM-DDi  NzDashboard error for developer '': r     )strr   argsgetr   strptimer   
ValueErrorr   analyzerget_dashboard_data	Exceptionprint	traceback	print_exc)developer_idZdate_strr   dataer!   r   r   r   r   )   s     
r   z,/api/productivity/<path:developer_id>/weeklyc              
   C   s  t | } zddlm} t  }||dd }g }g }g }|}||krt| ||\}}	t||	}
||	d ||
 ||dd7 }q@t
||dW S  tk
 r } z@td|  d	|  dd
l}|  t
dt |idf W Y S d
}~X Y nX d
S )zGet weekly productivity trendr   )	timedelta   )Zdaysz%a   )datesscoresz)Weekly productivity error for developer 'r   Nr   r   )r   r   r&   Znowr   r   Zget_developer_activitiesZcalculate_productivity_scoreappendstrftimer   r   r    r!   r"   )r#   r&   Zend_dateZ
start_dateZweekly_datar)   r*   Zcurrent_dateZ
activitiesZtotal_durationZscorer%   r!   r   r   r   get_weekly_productivityA   s8      

r-   z/api/developersc                  C   s  d} zt  }| v}td ||  | }tdt| d g }|D ]8}t|d }d| }|||d td|  qPW 5 Q R X W 5 Q R X t	|W S  t
k
r } z4td	|  dd
l}	|	  ztd t  }| }|d g }| D ]2}|d rt|d }||d| d qtdt| d t	|W  5 Q R  W  5 Q R  W  W Y rS Q R X W 5 Q R X W nX t
k
r }
 z8td|
  t	ddt|
 idf W Y 
 W Y S d
}
~
X Y nX W 5 d
}~X Y nX d
S )z;Get list of all developers - Fixed for VARCHAR developer_idaR  
    SELECT DISTINCT 
        CAST(developer_id AS VARCHAR) as id,
        CAST(developer_id AS VARCHAR) as display_name
    FROM activity_records
    WHERE developer_id IS NOT NULL 
        AND CAST(developer_id AS VARCHAR) != ''
        AND LENGTH(TRIM(CAST(developer_id AS VARCHAR))) > 0
    ORDER BY CAST(developer_id AS VARCHAR)
    zExecuting developers query...zFound z developersr   z
Developer )idnamez  - Developer: zError fetching developers: NzTrying fallback query...z
                        SELECT DISTINCT developer_id::text 
                        FROM activity_records 
                        WHERE developer_id IS NOT NULL
                        ORDER BY 1
                    zFallback query found zFallback query also failed: r   zDatabase error: r   )r   get_connectioncursorr    executefetchalllenr   r+   r   r   r!   r"   )queryconnr1   rowsZ
developersrowZdev_idr/   r%   r!   Ze2r   r   r   get_developersd   sP    



$




>r9   z/api/test-connectionc                  C   s  zt  } |  }|d | d }|d | d }|d dd | D }|d | }td||||r|d nd	d
W  5 Q R  W  5 Q R  W S Q R X W 5 Q R X W nL tk
r } z,ddl}tdt	||
 ddf W Y S d}~X Y nX dS )zTest database connectionzSELECT version()r   z%SELECT COUNT(*) FROM activity_recordsz
                    SELECT DISTINCT CAST(developer_id AS VARCHAR) as dev_id
                    FROM activity_records 
                    WHERE developer_id IS NOT NULL 
                    ORDER BY 1
                    LIMIT 5
                c                 S   s   g | ]}t |d  qS )r   )r   ).0r8   r   r   r   
<listcomp>   s     z#test_connection.<locals>.<listcomp>z
                    SELECT data_type 
                    FROM information_schema.columns 
                    WHERE table_name = 'activity_records' 
                    AND column_name = 'developer_id'
                Z	connectedunknown)statusZdatabase_versionZactivity_records_countZsample_developer_idsZdeveloper_id_typeNr   )r=   r   r!   r   )r   r0   r1   r2   Zfetchoner3   r   r   r!   r   
format_exc)r6   r1   versioncountZsample_devsZ	data_typer%   r!   r   r   r   test_connection   s6    





6rA   z$/api/sample-data/<path:developer_id>c           	      C   s  t | } zd}t }| }||| f | }g }|D ]B}|t |d |d |d |d rr|d  nd|d d q@t| t	||d	W  5 Q R  W  5 Q R  W S Q R X W 5 Q R X W nJ t
k
r } z*ddl}tt || d
df W Y S d}~X Y nX dS )z/Get sample data for a developer to debug issuesz
        SELECT CAST(developer_id AS VARCHAR), app, title, timestamp, duration
        FROM activity_records
        WHERE CAST(developer_id AS VARCHAR) = %s
        ORDER BY timestamp DESC
        LIMIT 10
        r   r(         N   )r#   apptitleZ	timestampZduration)r#   Zsample_countr$   )r   r!   r   )r   r   r0   r1   r2   r3   r+   Z	isoformatr   r4   r   r!   r>   )	r#   r5   r6   r1   r7   r$   r8   r%   r!   r   r   r   get_sample_data   s:    



6rG   __main__ZAPI_PORTi  Z
DEBUG_MODETruetruez&Starting dashboard API server on port z...z Dashboard URL: http://localhost:zDebug mode: z
Database: r   @r   :r   z
API Endpoints:z  Dashboard: http://localhost:z$  Test Connection: http://localhost:z$  Developers List: http://localhost:zF
IMPORTANT: This version handles VARCHAR developer_id fields correctlyz0.0.0.0)debugr   r   )%Zflaskr   r   r   r   Z
flask_corsr   r   ossysZdotenvr   pathr+   dirnameabspath__file__Zbackend.activity_analyzer_fixedr	   __name__rE   getenvintZ	DB_CONFIGr    r   Zrouter   r   r-   r9   rA   rG   r   lowerrM   runr   r   r   r   <module>   s`   $



	


"
C
.
'
&