Ë
    ²^´j…  ã                  ól   — d dl mZ d dlZd dlZd dlZd dlmZmZ d dlmZm	Z	m
Z
 d	d„Zd	d„Zd
d„Zdd„Zy)é    )ÚannotationsN)ÚdatetimeÚtimezone)ÚINTERNAL_TOKEN_FILEÚconnectÚensure_dirsc                 ó„   — t        j                  t        j                  «      j	                  d¬«      j                  «       S )Nr   )Úmicrosecond)r   Únowr   ÚutcÚreplaceÚ	isoformat© ó    ú?/var/www/origus_pro_usr/data/www/origus.pro/core/core_schema.pyÚutc_nowr      s,   € Ü<‰<œŸ™Ó%×-Ñ-¸!Ð-Ó<×FÑFÓHÐHr   c                 ó@  — t        «        t        j                  «       r(t        j                  d¬«      j	                  «       } | r| S t        j                  d«      } t        j                  | d¬«       	 t        j                  t        d«       | S # t        $ r Y | S w xY w)Nzutf-8)Úencodingé0   i€  )r   r   ÚexistsÚ	read_textÚstripÚsecretsÚtoken_urlsafeÚ
write_textÚosÚchmodÚOSError)Útokens    r   Úensure_internal_tokenr       sˆ   € Ü„MÜ×!Ñ!Ô#Ü#×-Ñ-°wÔ?×EÑEÓGˆÙØˆLÜ×!Ñ! "Ó%€EÜ×"Ñ" 5°7Õ;ðÜ
‰Ô$ eÔ,ð €Løô ò ØØ€Lðús   Á4B Â	BÂBc                óÄ   — | j                  d|› d«      j                  «       D ch c]  }t        |d   «      ’Œ }}||vr| j                  d|› d|› d|› «       y y c c}w )NzPRAGMA table_info(ú)é   zALTER TABLE z ADD COLUMN ú )ÚexecuteÚfetchallÚstr)ÚconÚtableÚcolumnÚddlÚrowÚcolumnss         r   Ú_ensure_columnr.      sk   € Ø&)§k¡kÐ4FÀuÀgÈQÐ2OÓ&P×&YÑ&YÓ&[Ö\˜sŒs3q‘6{Ð\€GÐ\ØWÑØ‰l 5 '¨°f°X¸Q¸s¸eÐDÕEð ùò ]s   ¦Ac                 ó
  — t        «        t        «        t        «       5 } | j                  d«       t	        | ddd«       t	        | ddd«       | j                  d«       ddd	d
dddœfddd	ddddœfddd	ddddœfg}|D ]4  \  }}}}}| j                  d||||t        j                  |d¬«      f«       Œ6 | j                  d«       | j                  dt        «       f«       | j                  «        d d d «       y # 1 sw Y   y xY w)Nat  
        CREATE TABLE IF NOT EXISTS connectors(
            connector_key TEXT PRIMARY KEY,
            connector_name TEXT NOT NULL,
            connector_type TEXT NOT NULL,
            base_url TEXT,
            status TEXT NOT NULL DEFAULT 'not_configured',
            last_test_at TEXT,
            last_sync_at TEXT,
            last_error TEXT,
            meta_json TEXT NOT NULL DEFAULT '{}'
        );

        CREATE TABLE IF NOT EXISTS tracked_documents(
            id INTEGER PRIMARY KEY,
            source_key TEXT NOT NULL,
            document_slug TEXT NOT NULL,
            document_code TEXT NOT NULL,
            search_query TEXT NOT NULL,
            discovered_url TEXT,
            enabled INTEGER NOT NULL DEFAULT 1,
            last_checked_at TEXT,
            last_changed_at TEXT,
            last_hash TEXT,
            last_snapshot_id INTEGER,
            last_error TEXT,
            UNIQUE(source_key, document_slug)
        );

        CREATE TABLE IF NOT EXISTS source_snapshots(
            id INTEGER PRIMARY KEY,
            source_key TEXT NOT NULL,
            document_slug TEXT NOT NULL,
            document_code TEXT NOT NULL,
            source_url TEXT NOT NULL,
            checked_at TEXT NOT NULL,
            content_hash TEXT NOT NULL,
            title TEXT,
            text_path TEXT,
            html_path TEXT,
            downloaded_file_path TEXT,
            manifest_path TEXT,
            is_current INTEGER NOT NULL DEFAULT 1,
            extraction_status TEXT NOT NULL DEFAULT 'raw_saved',
            extraction_meta_json TEXT NOT NULL DEFAULT '{}'
        );

        CREATE INDEX IF NOT EXISTS idx_core_snapshots_document
            ON source_snapshots(source_key, document_slug, checked_at);
        CREATE INDEX IF NOT EXISTS idx_core_tracked_enabled
            ON tracked_documents(source_key, enabled);

        CREATE TABLE IF NOT EXISTS ai_runs(
            id INTEGER PRIMARY KEY,
            purpose TEXT NOT NULL,
            provider TEXT,
            model TEXT NOT NULL,
            created_at TEXT NOT NULL,
            status TEXT NOT NULL,
            input_hash TEXT,
            result_meta_json TEXT NOT NULL DEFAULT '{}',
            error TEXT
        );

        CREATE TABLE IF NOT EXISTS ai_settings(
            singleton INTEGER PRIMARY KEY CHECK(singleton=1),
            primary_provider TEXT NOT NULL DEFAULT 'groq',
            fallback_enabled INTEGER NOT NULL DEFAULT 0,
            fallback_order_json TEXT NOT NULL DEFAULT '["gemini","openrouter"]',
            updated_at TEXT NOT NULL
        );

        CREATE TABLE IF NOT EXISTS knowledge_documents(
            id INTEGER PRIMARY KEY,
            document_slug TEXT NOT NULL,
            source_snapshot_id INTEGER NOT NULL,
            document_code TEXT NOT NULL,
            title TEXT,
            source_hash TEXT NOT NULL,
            status TEXT NOT NULL DEFAULT 'review_required',
            completeness_status TEXT NOT NULL DEFAULT 'unknown',
            completeness_score REAL,
            completeness_reasons_json TEXT NOT NULL DEFAULT '[]',
            last_visible_section TEXT,
            model TEXT,
            extracted_at TEXT NOT NULL,
            is_current INTEGER NOT NULL DEFAULT 1,
            meta_json TEXT NOT NULL DEFAULT '{}',
            UNIQUE(document_slug, source_snapshot_id)
        );

        CREATE INDEX IF NOT EXISTS idx_knowledge_documents_current
            ON knowledge_documents(document_slug, is_current);

        CREATE TABLE IF NOT EXISTS knowledge_rules(
            id INTEGER PRIMARY KEY,
            knowledge_document_id INTEGER NOT NULL,
            document_slug TEXT NOT NULL,
            source_snapshot_id INTEGER NOT NULL,
            rule_type TEXT NOT NULL,
            legal_basis TEXT,
            statement TEXT NOT NULL,
            conditions_json TEXT NOT NULL DEFAULT '[]',
            outcomes_json TEXT NOT NULL DEFAULT '[]',
            confidence REAL,
            review_status TEXT NOT NULL DEFAULT 'review_required',
            ai_run_id INTEGER,
            created_at TEXT NOT NULL,
            FOREIGN KEY(knowledge_document_id)
                REFERENCES knowledge_documents(id)
                ON DELETE CASCADE
        );

        CREATE INDEX IF NOT EXISTS idx_knowledge_rules_document
            ON knowledge_rules(document_slug, rule_type, review_status);

        CREATE TABLE IF NOT EXISTS product_analyses(
            id INTEGER PRIMARY KEY,
            created_at TEXT NOT NULL,
            input_hash TEXT NOT NULL,
            provider TEXT,
            model TEXT NOT NULL,
            result_json TEXT NOT NULL,
            ai_run_id INTEGER
        );
        Úai_runsÚproviderÚTEXTÚproduct_analysesuÔ  
            INSERT INTO connectors(connector_key,connector_name,connector_type,base_url,status,meta_json)
            VALUES('techexpert','Ð¢ÐµÑ…ÑÐºÑÐ¿ÐµÑ€Ñ‚','legal_source','http://nps3.cntd.ru/docs','not_configured','{}')
            ON CONFLICT(connector_key) DO UPDATE SET
              connector_name=excluded.connector_name,
              connector_type=excluded.connector_type,
              base_url=COALESCE(connectors.base_url, excluded.base_url)
        Úgroqz	Groq FreeÚaizhttps://api.groq.com/openai/v1zopenai/gpt-oss-120bÚprimary)ÚmodelÚroleÚgeminizGemini Freez8https://generativelanguage.googleapis.com/v1beta/openai/zgemini-3.6-flashÚfallbackÚ
openrouterzOpenRouter Freezhttps://openrouter.ai/api/v1zopenrouter/freeaŠ  
                INSERT INTO connectors(connector_key,connector_name,connector_type,base_url,status,meta_json)
                VALUES(?,?,?,?, 'not_configured', ?)
                ON CONFLICT(connector_key) DO UPDATE SET
                  connector_name=excluded.connector_name,
                  connector_type=excluded.connector_type,
                  base_url=excluded.base_url
            F)Úensure_asciizZUPDATE connectors SET status='legacy' WHERE connector_key='openai' AND connector_type='ai'zâ
            INSERT INTO ai_settings(singleton,primary_provider,fallback_enabled,fallback_order_json,updated_at)
            VALUES(1,'groq',0,'["gemini","openrouter"]',?)
            ON CONFLICT(singleton) DO NOTHING
        )
r   r    r   Úexecutescriptr.   r%   ÚjsonÚdumpsr   Úcommit)r(   Ú	providersÚkeyÚnameÚctypeÚurlÚmetas          r   Úinit_core_schemarG   $   sB  € Ü„MÜÔÜ	‹ð hcØ×Ñð }ô }	ô@ 	s˜I z°6Ô:ÜsÐ.°
¸FÔCà‰ð ô 	ð K Ð%EØ+°9Ñ=ð?àm DÐ)cØ(°
Ñ;ð=àÐ+¨DÐ1OØ'¨zÑ:ð<ð
ˆ	ð (1ò 	KÑ#ˆCU˜3˜tØK‰Kð ð d˜5 ¤T§Z¡Z°À%Ô%HÐIõKð	Kð 	‰ÐpÔqà‰ð ô ‹iˆ\ô		ð
 	
‰
Œ÷Qh÷ hñ hús   ŸCC9Ã9D)Úreturnr'   )r)   r'   r*   r'   r+   r'   rH   ÚNone)rH   rI   )Ú
__future__r   r>   r   r   r   r   Úcore_dbr   r   r   r   r    r.   rG   r   r   r   ú<module>rL      s1   ðÝ "ã Û 	Û ß 'ç =Ñ =óIóóFôkr   