U
    [Mh                     @   s   d dl mZ d dlmZ d dlZG dd deZeddd Ze	d	e
efeed
ddZede
efedddZdS )    )	BaseModel)OptionalNc                   @   sf   e Zd ZU eed< eed< eed< dZee ed< dZee ed< dZ	ee ed	< d
Z
ee ed< dS )DeveloperRegistrationdeveloper_namedeveloper_id	api_tokenz	127.0.0.1
ip_addressi  activitywatch_portunknownhostnameTactiveN)__name__
__module____qualname__str__annotations__r   r   r	   intr   r   bool r   r   ./registration_endpoints.pyr      s   
r   z/register-developerc                      s   t dS )z%Serve the developer registration formzregister-developer.html)ZFileResponser   r   r   r   serve_registration_form   s    r   z/api/register-developer)registrationdbc                    sx  z| j dstddd|tdd| ji }|rPtdd| j dd|td	d
| j i }|rztdddzD|td |td |td |td |  W n   Y nX td}||| j| j| j | j	| j
| j| jd |  dd| j| jddW S  tk
r2    Y nB tk
rr } z"|  tddt| dW 5 d}~X Y nX dS )z'Register a new developer for monitoringZAWToken_i  z=Invalid access token format. Token must start with 'AWToken_'Zstatus_codeZdetailz@SELECT developer_id FROM developers WHERE developer_id = :dev_idZdev_idzDeveloper ID 'z' already existsz<SELECT developer_id FROM developers WHERE api_token = :tokentokenz#This access token is already in usezZALTER TABLE developers ADD COLUMN IF NOT EXISTS ip_address VARCHAR(45) DEFAULT '127.0.0.1'zWALTER TABLE developers ADD COLUMN IF NOT EXISTS activitywatch_port INTEGER DEFAULT 5600zWALTER TABLE developers ADD COLUMN IF NOT EXISTS hostname VARCHAR(255) DEFAULT 'unknown'zRALTER TABLE developers ADD COLUMN IF NOT EXISTS last_sync TIMESTAMP WITH TIME ZONEaN  
            INSERT INTO developers (
                developer_id, name, api_token, ip_address, 
                activitywatch_port, hostname, active, created_at
            ) VALUES (
                :developer_id, :name, :api_token, :ip_address,
                :activitywatch_port, :hostname, :active, NOW()
            )
        )r   namer   r   r	   r   r   Tz!Developer registered successfullyZimmediately)successmessager   r   Zmonitoring_starts  zRegistration failed: N)r   
startswithHTTPExceptionexecutetextr   ZfetchoneZcommitr   r   r	   r   r   	ExceptionZrollbackr   )r   r   Zexisting_devZtoken_checkZinsert_queryer   r   r   register_developer   sr    

r%   z/api/developers-status)r   c                    s   zt d}| |}g }|D ]V}||d |d |d |d |d rP|d  nd|d |d dkrhd	nd
d qd|t|dW S  tk
r } ztddt| dW 5 d}~X Y nX dS )z'Get status of all registered developersa  
            SELECT 
                d.developer_id,
                d.name,
                d.ip_address,
                d.active,
                d.last_sync,
                COUNT(ar.id) as recent_activities
            FROM developers d
            LEFT JOIN activity_records ar ON d.developer_id = ar.developer_id 
                AND ar.created_at > NOW() - INTERVAL '1 hour'
            WHERE d.active = true
            GROUP BY d.developer_id, d.name, d.ip_address, d.active, d.last_sync
            ORDER BY d.name
        r               N   Z
monitoringZ
registered)r   r   r   r   Z	last_syncZrecent_activitiesstatusT)r   
developersZtotal_countr   z!Error getting developers status: r   )r"   r!   appendZ	isoformatlenr#   r    r   )r   Zqueryresultr,   rowr$   r   r   r   get_developers_statuso   s.    

r1   )Zpydanticr   typingr   rer   Zappgetr   ZpostZDependsZget_dbZSessionr%   r1   r   r   r   r   <module>   s   
W