
    W#j.9                         d dl Z d dlZd dlmZ  ee                                          j        Zedz  dz  Zd Z	dddZ
d Zd	 Zd
 Zd Zd Zedk    r& e e j         e            dd                     dS dS )    N)PathDATABASEzGRAFO_D_DATABASE.sqlitec                      t          j        t                    } t           j        | _        |                     d           | S )NzPRAGMA foreign_keys = ON)sqlite3connect	SQLITE_DBRowrow_factoryexecute)cons    [/home/sebarchitect/Desktop/REPOSITORIO/GRAF MOTOR/GRAFO_D_V54_RUN/grafo_d_sqlite_adapter.py_connectr   	   s2    
/)
$
$CkCOKK*+++J    defaultc                ~    | |S t          |                                           }|D ]}||v r| |         }||c S |S )uw   
    Lector tolerante para sqlite3.Row.
    Permite soportar nombres canónicos y alias sin romper bases antiguas.
    )setkeys)rowr   namesr   namevalues         r   
_row_valuer      sW    
 {sxxzz??D  4<<IE Nr   c                 (    | dS t          |           S N )str)r   s    r   _clean_textr   #   s    }ru::r   c                 F   g }	 d |                      d                                          D             }|s|S |                      dd                    |          z   dz                                             }|D ]}i }d}d|v r
|d         pd}|rP	 t          j        |          }t          |t                    r|                    |           n# t          $ r Y nw xY w|D ]}||         }	|	|	||<   |	                    d	|
                    d
          p|
                    d          pd           |	                    d
|
                    d	                     |	                    dd           |	                    dd           |	                    dd           |	                    dd           |	                    dd           t          |
                    d                    |d<   |                    |           n# t          j        $ r g cY S w xY w|S )u   
    Carga tolerante de api_registry.

    Prioridad:
    1. Si existe raw_json válido, se usa como base.
    2. Se mezclan columnas reales de la tabla para que el frontend/backend
       pueda leer id, endpoint, enabled, status, target_graph, etc.
    c                     g | ]
}|d          S r    ).0rs     r   
<listcomp>z&_load_api_registry.<locals>.<listcomp>5   s,     
 
 
 fI
 
 
r   zPRAGMA table_info(api_registry)zSELECT z, z FROM api_registry ORDER BY idr   raw_jsonNidr   endpointapienabledTmethodGETtarget_graphstatusunknown)r   fetchalljoinjsonloads
isinstancedictupdate	Exception
setdefaultgetboolappendr   OperationalError)
curapi_registrycolsrowsr   itemr&   parsedcolr   s
             r   _load_api_registryrD   )   sn    L.
 
[[!BCCLLNN
 
 

  	 {{		$'*JJ
 

(** 	  	& 	&CDHT!!z?0b !Z11F!&$// ,F+++    D  & &C$ %DIOOD$((6"2"2"Sdhhz6J6J"SeTTTOOFDHHTNN333OOIt,,,OOHe,,,OOJ+++OONB///OOHi000"488I#6#677DO%%%%=	&@ #   			 s<   4H
 AH
 >CH
 
CH
 CD*H
 
HHc                    t          | t                    si } t          |t                    s| S t          |           }|                                D ]\  }}t          |t                    s|||<    |                    |          }t          |t                    si }t          |          }|                                D ]%\  }}|dvr|||<   |                    ||           &|||<   |S )u1  
    Mezcla metadata persistida desde ui_state sin perder datos canónicos de SQLite.

    Regla:
    - Si SQLite trae PLACE / WHO / BRIEF, esos valores son fuente principal.
    - Si ui_state trae campos adicionales, se conservan.
    - Si ui_state trae valores vacíos, no borra valores canónicos.
    r   )r4   r5   itemsr9   r8   )		canonical	persistedmergedkeypersisted_valuecanonical_valuerA   fieldr   s	            r   _merge_dict_preserve_canonicalrN   g   s	    i&& 	i&& )__F ) 1 1  _/400 	)F3K **S///400 	! OO$$+1133 	. 	.LE5J&&#Uu----sMr   c                  L  345 t                      } |                                 }|                    d                                          }g }i }|D ]	}t	          |dd           }|t	          |dd          }t	          |dd           }||}t	          |dd           }|d}t          t	          |dd	d
                    4t          t	          |ddd                    }	t          t	          |dd
                    p4 d|d          }
t          t	          |ddd
                    }t	          |ddd           }t	          |ddd           }t	          |ddd           }t          t	          |ddd
                    }t          t	          |dddd
                    }t          t	          |ddd d!d
                    }t          t	          |d"d#d$d
                    }t          t	          |d%d&d
                    }t          t	          |d'd(                    }t	          |d|          }i d|
d)|d         d*4d4d|	d|	dt          |pd          dt          |p|pd          dt          |pd          dt          |p|pd          d|d|d|d|d|d|d||||||||||||d+}|||d<   |||d<   |||d<   |                    |           4 d|d          d|d          d|	 }i d|
d)|d         d,|d*4d4d|	d|	d|d|d|d|d|d|d|d|d|d!|||||||d-}|||<   ||d.<   |                    d/                                          }|                    d0                                          }t          |          }d1d2d33d4 |D             }d5 |D             }t          d6 |D                       }i }|D ]U5d} t          5fd7|D                       }!|!D ].4t          45fd8|D                       }"t          | |"          } /| |5<   Vi }#d9}$|D ]5|$|#5<   |$|5         z  }$|D ]5i }%5fd:|D             }&|&                    d; <           |&D ]\}'t          |'                    d*                    4|%                    4d=          }(|#5         |(z   })|)|'d<   |)|'d<   d|'d<   |(dz   |%4<   ]g }*|D ]5|#5         }+|+|5         z   dz
  },|*                    i dd>5 d*d?dd?dt          5          dt          5          d|+d|,d|5         d5dt          5          dt          5          dd
dd
d!d
dd
dd
d"d
d
d
d@           i }-|D ]}'|'                    d.d           }|s|'                    d          }|'                    d|          }|'                    dd
          }.|'                    d*d
          4||d<   ||d<   ||-4 d| d| d|. <   |-}dAdBdC|*|z   g dDd dEdFdGdHdDdIdJdKg3fdL|D             dM |D             ||g dN|i i dO|dP	}/	 |                    dQ                                          }0|0D ]j}1|1dR         }	 t!          j        |1dS                   }2n# t$          $ r Y 3w xY w|dTk    r4t'          |/dU                             dTi           |2          |/dU         dT<   q|dVk    rt)          |2t*                    r|2                    dV|/dU         dV                             dVg                      |2                    dW|/dU         dV                             dWi                      |2                    dX|/dU         dV                             dXi                      |2                    dYg            |2|/dU         dV<   Q|2|/                    dUi           |<   ln# t.          j        $ r Y nw xY w|                                  |/S )ZNa  
        SELECT
            e.*,
            g.visible_name AS graph_visible_name,
            g.row_key AS graph_row_key,
            f.name AS folder_name
        FROM events e
        JOIN graphs g ON g.id = e.graph_id
        JOIN folders f ON f.id = g.folder_id
        ORDER BY
            g.id,
            COALESCE(e.date_year, 999999),
            COALESCE(e.date_month, 99),
            COALESCE(e.date_day, 99),
            e.sort_index,
            e.id
    	start_colr   
sort_index   end_coldurationrow_keygraph_row_keyr   
event_namer   zUntitled event	legacy_id:r'   	date_textdate	date_yearyear
date_monthmonthdate_daydayplacePLACEwhoWHOactorbrief_descriptionbriefBRIEFdescriptionsource_linkurlsourceapi_textr)   folder_nameUncategorizeddb_idr   )rd   re   rj   rh   ri   rg   rk   r)   rn   foldergrouprs   )rh   ri   rg   rk   r)   rn   _metazK
        SELECT name, is_open
        FROM folders
        ORDER BY id
    z
        SELECT g.row_key, g.visible_name, f.name AS folder_name
        FROM graphs g
        JOIN folders f ON f.id = g.folder_id
        ORDER BY g.id
    PAYLOAD HISTISS)ru   rv   c                 ,    i | ]}|d          |d         S )rU   ro   r"   )r#   gs     r   
<dictcomp>z!load_database.<locals>.<dictcomp>,  s3        	
)a&  r   c                 F    i | ]}|d          t          |d                   S )r   is_open)r:   r#   fs     r   ry   z!load_database.<locals>.<dictcomp>1  s:        	
&	4)%%  r   c                 P    h | ]#}d |v |d          t          |d                    $S r]   )int)r#   es     r   	<setcomp>z load_database.<locals>.<setcomp>6  s>       Q;;1V90 	AfI000r   c                     h | ]=}|                     d           k    t          |                     d                    >S )r]   r   r9   r   r#   r   r]   s     r   r   z load_database.<locals>.<setcomp>A  sJ     
 
 
uuV}}$$ e$$$r   c              3      K   | ]E}|                     d           k    t          |                     d                    k    AdV  FdS )r]   r   rR   Nr   )r#   r   rU   r]   s     r   	<genexpr>z load_database.<locals>.<genexpr>H  s`        55==D((Su->->'-I-I -I-I-I-I r      c                 F    g | ]}|                     d           k    |S r   r9   r   s     r   r%   z!load_database.<locals>.<listcomp>Z  s8     
 
 
uuV}}$$ $$$r   c           
         t          |                     dd                    t          |                     d          p|                     d          pd          t          |                     d          p|                     d          pd          t          |                     d          p|                     d	          pd
          t          |                     dd                    fS )Nr   r   r^   r_   c   r`   ra   rQ   rP   r   r   )r   r9   r   )r   s    r   <lambda>zload_database.<locals>.<lambda>_  s    eR  !!l##;quuW~~;<<j!!7QUU5\\7R88l##>quu['9'9>Q??fb!!""(
 r   )rJ   r   AXIS___AXIS__)r)   rn   grafo_d_sqlite_adapterz55-front-fields-api-readyzexisting-engine-unchangedsqlite_canonicalz:Runtime data loaded from canonical SQLite through adapter.engine_ownedz>Events now expose place/who/brief fields directly to frontend.)r.   active_graphschema_notetimeline_layoutv55_notezSQLite Canonicalsqlite)r'   r   typec                 b    i | ]+}|d                               |d          |d                   ,S )rU   visible_namer   )r#   rx   canonical_graph_labelss     r   ry   z!load_database.<locals>.<dictcomp>  sI        )4889qGXYY  r   c                     g | ]
}|d          S r!   r"   r|   s     r   r%   z!load_database.<locals>.<listcomp>  s    777!AfI777r   )foldersgraphFolderopendeletedRows)graph_labelsr   
event_metafolder_metagraph_set_cards)	schemaversionengine_versionevents
categoriesmetadatagraphsui_stater>   z_
            SELECT key, value_json
            FROM ui_state
            ORDER BY key
        rJ   
value_jsonr   r   r   r   r   r   )r   cursorr   r0   r   r   r   r;   rD   sortedsummaxsortr   r9   popr2   r3   r7   rN   r4   r5   r8   r   r<   close)6r   r=   r@   r   r   r$   rP   rS   rT   rW   rX   rZ   r\   r^   r`   rb   rd   rg   rk   rn   ro   rQ   eventrJ   metar   r   r>   graph_folder
open_stateyearswidth_by_year	max_countrow_keyscountstart_by_yearrC   per_rowyear_eventsr   idx
target_colaxis_eventsstartendrebuilt_event_metar   dataui_rowsuir   r   rU   r]   s6                                                      @@@r   load_databaser      s   
**C
**,,C;;  	 	  
! 	$ FJ n nq+t<<<	"1lA>>>IQ	4888?GaT:::HjIPRSSSTT A|VM]!^!^!^__

1k2 F F FGGagKaKaXYZ^X_KaKa	
1k62 N N NOO	q+vtDDD	<$GGG
aUDAAAJq'7BGGGHH*QugrJJJKK'#  	
 	
 "*QuhXZ"["["[\\z!ZKKKLL!*Q"W"W"WXX<CCC

)
QtW
 7
 w	

 J
 *
 Y^!,,
 s74i4155
 HM**
 #j:I:;;
 I
 
 
  *!
" #
$ U%
& U'
( ,&&!2& ! =
 
 
B  %E&M!'E'N#E%LeOO5-OOi0@OO:OO
)
QtW
 [
 7	

 w
 J
 *
 I
 
 I
 Z
 8
 U
 U
 3
  3!
" ,#
$ '&!2& /
 
 
4 
3gkk  	 	 
	  [[  	 	
 
  &c**L ' 
   L
   J
       E M ( (	 
 
 
 

 
 
     	. 	.G     !    E Iu--II'dM
C # #!d}T"" ' '
 
 
 

 
 

 	 
 
 	 	 	  		' 		'A!%%,,''G++gq))C&t,s2J'AkN%AiLAjM"QwGG		' K  d#mD))A- 
.$..
:
 z
 CII	

 #d))
 
 s
 d+
 D
 CII
 T
 R
 2
 2
 R
   !
" 2#
$ '
 
 
 	 	 	 	0  M MuuWd## 	EE+&&	%%	9--uuVR  %%r""%[!YHLgDD	DDGDDdDDEE#J +.5&( W-X
 
 )*  
     
 87w777+"!	  %!
 
 %G$ $DR++    XZZ	 	  	= 	=BU)C
2l#344    l""1O$((r::2 2Z .. 	!!eT** 8$$YZ0@0K0O0OPY[]0^0^___$$]D4DY4O4S4STace4f4fggg$$VT*-=i-H-L-LVUW-X-XYYY$$]B77727D$Y/7<
B//44+	=. #    IIKKKKs7   %4_; Z54_; 5
[?_; [D8_; ;``c                      t          d          )Nz:Direct JSON save is disabled. Use SQLite write operations.)RuntimeError)r   s    r   save_databaser     s    
S
T
TTr   __main__r   F)indentensure_ascii)r2   r   pathlibr   __file__resolveparentROOTr   r   r   r   rD   rN   r   r   __name__printdumpsr"   r   r   <module>r      s          tH~~&: 99	   %)     &  ; ; ;|% % %P` ` `FU U U z	E*$*]]__QU
C
C
CDDDDD r   