U
    [Mh,                     @   s  d dl Z d dlmZmZmZmZmZmZmZm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZmZ zd dlmZmZ ed W n, ek
r   ed ed	 ed
 Y nX e eZdd Zdd Zd*ddZdd Zdd Z dd Z!edkre j"e j#d ed ed ed e  redd  ed e$dZ%e%& dkrde! r\ed ned  edd  ed! ed" ed# ed$ ed% ed& ed  n0edd  ed' ed( ed) ed  dS )+    N)
create_engineColumnIntegerStringDateTimeFloatTextBooleanMetaDataTable)declarative_base)func)OperationalErrorProgrammingError)engineSessionLocalz%Successfully imported database enginez(Could not import engine from database.pyz,Please check your database.py file structure   c                 C   s   zDt  2}|d|  d}tt|dkW  5 Q R  W S Q R X W nf   zHt  6}|d|  d}tt|dkW  5 Q R  W  Y S Q R X W n   Y Y dS X Y nX dS )zCheck if a table existsz<SELECT name FROM sqlite_master WHERE type='table' AND name=''r   zo
                    SELECT table_name FROM information_schema.tables 
                    WHERE table_name = ''
                FNr   connectexecutelenlist)
table_nameconnresult r   ./database_migration.pycheck_table_exists   s    
(

,r   c                 C   s   zJt  8}|d|  d}dd |D }||kW  5 Q R  W S Q R X W nl   zNt  <}|d|  d| d}tt|dkW  5 Q R  W  Y S Q R X W n   Y Y d	S X Y nX d
S )z#Check if a column exists in a tablezPRAGMA table_info()c                 S   s   g | ]}|d  qS )r   r   ).0rowr   r   r   
<listcomp>,   s     z'check_column_exists.<locals>.<listcomp>zq
                    SELECT column_name FROM information_schema.columns 
                    WHERE table_name = 'z' AND column_name = 'r   r   FNr   )r   column_namer   r   columnsr   r   r   check_column_exists&   s     
 

,r&   c                 C   s   zt | |st }|r:d|  d| d| d| d	}nd|  d| d| }|| |  td| d|   td| d|   W 5 Q R  W d	S Q R X ntd
| d|   W d	S W nZ tk
r } z:t	d| d|  d|  td| d|  W Y dS d}~X Y nX dS )z2Safely add a column to a table if it doesn't existzALTER TABLE z ADD COLUMN  z
 DEFAULT 'r   zAdded column z to u   ✓ Added column Tu   ✓ Column z already exists in zFailed to add column : u   ✗ Failed to add column FN)
r&   r   r   r   commitloggerinfoprint	Exceptionerror)r   r$   Zcolumn_typeZdefault_valuer   sqler   r   r   add_column_safely:   s"    

 

r1   c                 C   s4  z^t  L}d|  d| d| d}|| |  td|   W 5 Q R  W dS Q R X W n tk
r. } zzdt  R}d|  d| d| d}|| |  td|   W 5 Q R  W W Y XdS Q R X W nF tk
r } z&td|  d	|  W Y 
W Y dS d
}~X Y nX W 5 d
}~X Y nX d
S )z*Safely create an index if it doesn't existzCREATE INDEX IF NOT EXISTS z ON (r    zCreated index TzCREATE INDEX zCould not create index r(   N)r   r   r   r)   r*   r+   r-   Zwarning)
index_namer   r$   r   r/   r0   Ze2r   r   r   create_index_safelyQ   s$    



 r4   c               
   C   sT  t d  ztdrdt d dddddg} d	}| D ]\}}td||s2d
}q2|rZt d qlt d nt d t d tdst }G dd d|}|jjtd t d nt d t d ddddddddg}|D ]\}}}	t|rt|||	 qt d t d W d	S  tk
rN }
 z(t	
d |
  t d!|
  W Y d
S d"}
~
X Y nX d"S )#z:Add new columns and tables for dynamic developer discoveryzStarting database migration...activity_recordsz&
1. Updating activity_records table...)developer_idVARCHAR(255))developer_namer7   )Zdeveloper_hostnamer7   )	device_idr7   )Zbucket_namer7   TFu/   ✓ Successfully updated activity_records tableu7   ⚠ Some columns could not be added to activity_recordsuN   ⚠ activity_records table not found - will be created by your existing modelsz+
2. Creating discovered_developers table...discovered_developersc                   @   s   e Zd ZdZeedddZeedZeedZee	Z
eedZeedZeeZeedZee	ddZee	ddZeedddZeeZeeZeedZeee dZeeddZeee dZeee e d	Zd
S )z-migrate_database.<locals>.DiscoveredDeveloperr:      T)Zprimary_key2   r   )defaultunknown)r=   ZonupdateN)__name__
__module____qualname__Z__tablename__r   r   idnameZhostr   ZportZhostnamer9   r   descriptionversionZbucket_countZactivity_countstatusr   	last_seenZlast_checkedsourcer   ZnowZdiscovered_atr	   	is_active
created_atZ
updated_atr   r   r   r   DiscoveredDeveloper   s&   rK   )Zbindu'   ✓ Created discovered_developers tableu.   ✓ discovered_developers table already existsz 
3. Creating database indexes...)Z!idx_activity_records_developer_idr5   r6   )Z#idx_activity_records_developer_namer5   r8   )Zidx_activity_records_device_idr5   r9   )Zidx_activity_records_created_atr5   rJ   )Z idx_discovered_developers_statusr:   rF   )Z idx_discovered_developers_sourcer:   rH   )Z#idx_discovered_developers_is_activer:   rI   )Z#idx_discovered_developers_last_seenr:   rG   u   ✓ Database indexes createdu0   
🎉 Database migration completed successfully!zDatabase migration failed: u   
❌ Migration failed: N)r,   r   r1   r   ZmetadataZ
create_allr   r4   r-   r*   r.   )Zcolumns_to_addsuccessZcol_nameZcol_typeZBaserK   Zindexesr3   r   r$   r0   r   r   r   migrate_databaseg   sZ    


rM   c                  C   s   t d zt } zN| d}| d }|dkrX| d |   t d| d nt d W n0 tk
r } zt d|  W 5 d	}~X Y nX W 5 Q R X W d
S  tk
r } z(td|  t d|  W Y dS d	}~X Y nX d	S )z5Populate developer info for existing activity recordsz8
Populating existing data with default developer info...z
                    SELECT COUNT(*) FROM activity_records 
                    WHERE developer_id IS NULL OR developer_id = ''
                r   a{  
                        UPDATE activity_records 
                        SET developer_id = 'local_default',
                            developer_name = 'Local User',
                            developer_hostname = 'localhost',
                            device_id = 'local_default'
                        WHERE developer_id IS NULL OR developer_id = ''
                    u   ✓ Updated z6 existing activity records with default developer infou4   ✓ All activity records already have developer infou'   ⚠ Could not update existing records: NTz"Failed to populate existing data: u   ❌ Data population failed: F)	r,   r   r   r   Zfetchoner)   r-   r*   r.   )r   r   countr0   r   r   r   populate_existing_data   s$    



*rO   __main__)levelz<============================================================z0DYNAMIC DEVELOPER DISCOVERY - DATABASE MIGRATION
zMIGRATION SUCCESSFUL!zW
Do you want to populate existing activity records with default developer info? (y/n): )yZyesu   
✓ Data population completed!uB   
⚠ Data population had some issues, but migration was successfulzNEXT STEPS:z:1. Add the new Python files (developer_discovery.py, etc.)z,2. Update your app.py with new API endpointsz/3. Update your models.py with new model classesz4. Restart your backend serverz"5. Test the new discovery featureszMIGRATION FAILED!z9Please check the error messages above and fix any issues.z7You may need to manually check your database structure.)N)'ZloggingZ
sqlalchemyr   r   r   r   r   r   r   r	   r
   r   Zsqlalchemy.ext.declarativer   Zsqlalchemy.sqlr   Zsqlalchemy.excr   r   Zdatabaser   r   r,   ImportErrorexitZ	getLoggerr?   r*   r   r&   r1   r4   rM   rO   ZbasicConfigINFOinputZresponselowerr   r   r   r   <module>   sX   0

_*

