o
    	3iO                     @   s  d Z ddlZddlZddlZddlmZ ddlmZmZmZ ddl	m
Z
 ejejedZe
G dd dZe
G d	d
 d
ZG dd dZedkre Zejddddddd ejdddddddddd	 ed ee  ed ee  e  dS dS )u  
Analytics Database - Usta Assistant Analiz Veritabanı
======================================================
Arama ve soru-cevap verilerini kaydeder.

Kullanım:
    from analytics_db import AnalyticsDB
    
    db = AnalyticsDB()
    db.log_search(brand="JCB", model="JS330", query="hidrolik pompa", ...)
    db.log_question(brand="JCB", model="JS330", question="basınç değeri?", ...)
    N)datetime)DictListOptional)	dataclasszusta_analytics.dbc                   @   sZ   e Zd ZU dZeed< eed< eed< eed< eed< eed< eed< eed	< eed
< dS )	SearchLogu   Arama kaydıid
session_idbrandmodel
query_textquery_englishresults_countsearch_time_ms
created_atN__name__
__module____qualname____doc__int__annotations__str r   r   ./var/www/html/PEPCVSON/scripts/analytics_db.pyr      s   
 r   c                   @   sz   e Zd ZU dZeed< eed< eed< eed< eed< eed< eed< eed	< eed
< eed< eed< eed< eed< dS )QuestionLogu   Soru-cevap kaydır   r	   r
   r   pdf_pathpage_numberquestionquestion_englishanswer_englishanswer_turkish
confidenceresponse_time_msr   Nr   r   r   r   r   r   )   s   
 r   c                   @   s  e Zd ZdZefdefddZdd Zdd Z			
			
		
	dKdedededede	dede	de
de	dede	fddZ											
	dLdededede	dedededed ed!ed"e	dede	fd#d$ZdMded&e	dee fd'd(ZdMded&e	dee fd)d*Zdefd+d,ZdNdeded&e	dee fd.d/Z							dOd0ed1ed2ed3e	d4edededede	fd5d6Z	7		dPd8ed9ed:ed;ede	f
d<d=ZdQd&e	dee fd?d@ZdRd&e	dee fdBdCZdDe	defdEdFZdefdGdHZdIdJ ZdS )SAnalyticsDBuW   
    Analiz Veritabanı
    
    Arama ve soru-cevap verilerini SQLite'a kaydeder.
    db_pathc                 C   s    || _ d | _|   |   d S )N)r%   conn_connect_create_tables)selfr%   r   r   r   __init__B   s   zAnalyticsDB.__init__c              
   C   sn   zt j| jdd| _t j| j_td| j  W dS  ty6 } ztd|  d| _W Y d}~dS d}~ww )u   Veritabanına bağlanF)check_same_threadu#   ✓ Analytics DB bağlantısı OK: u%   ❌ Analytics DB bağlantı hatası: N)sqlite3connectr%   r&   Rowrow_factoryprint	Exception)r)   er   r   r   r'   H   s   
zAnalyticsDB._connectc                 C   s   | j sdS | j  }|d |d |d |d |d |d |d |d	 |d
 |d |d |d | j   td dS )u   Tabloları oluşturNa#  
            CREATE TABLE IF NOT EXISTS search_logs (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                session_id TEXT,
                brand TEXT,
                model TEXT,
                query_text TEXT,
                query_english TEXT,
                results_count INTEGER,
                top_result_pdf TEXT,
                top_result_page INTEGER,
                top_result_score REAL,
                search_time_ms INTEGER,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
            )
        aa  
            CREATE TABLE IF NOT EXISTS question_logs (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                session_id TEXT,
                brand TEXT,
                model TEXT,
                pdf_path TEXT,
                page_number INTEGER,
                question TEXT,
                question_english TEXT,
                answer_english TEXT,
                answer_turkish TEXT,
                confidence TEXT,
                safety_warnings TEXT,
                response_time_ms INTEGER,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
            )
        u  
            CREATE TABLE IF NOT EXISTS translation_feedback (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                session_id TEXT,
                feedback_type TEXT,  -- 'search_result' veya 'answer'
                original_text TEXT,
                translated_text TEXT,
                rating INTEGER,  -- 1-5 yıldız
                user_suggestion TEXT,  -- Kullanıcının önerdiği doğru çeviri
                brand TEXT,
                model TEXT,
                is_processed INTEGER DEFAULT 0,  -- Sözlüğe eklendi mi?
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
            )
        u  
            CREATE TABLE IF NOT EXISTS dictionary_suggestions (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                english_term TEXT,
                turkish_term TEXT,
                suggested_by TEXT,  -- 'user' veya 'system'
                context TEXT,  -- Hangi bağlamda kullanıldı
                vote_count INTEGER DEFAULT 1,
                is_approved INTEGER DEFAULT 0,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                UNIQUE(english_term, turkish_term)
            )
        zACREATE INDEX IF NOT EXISTS idx_search_brand ON search_logs(brand)zACREATE INDEX IF NOT EXISTS idx_search_model ON search_logs(model)zECREATE INDEX IF NOT EXISTS idx_search_date ON search_logs(created_at)zECREATE INDEX IF NOT EXISTS idx_question_brand ON question_logs(brand)zECREATE INDEX IF NOT EXISTS idx_question_model ON question_logs(model)zICREATE INDEX IF NOT EXISTS idx_question_date ON question_logs(created_at)zNCREATE INDEX IF NOT EXISTS idx_feedback_rating ON translation_feedback(rating)zVCREATE INDEX IF NOT EXISTS idx_suggestion_term ON dictionary_suggestions(english_term)u   ✓ Analytics tabloları hazır)r&   cursorexecutecommitr0   )r)   r3   r   r   r   r(   R   s"   













zAnalyticsDB._create_tables r           Nr
   r   r   r   r   top_result_pdftop_result_pagetop_result_scorer   r	   returnc                 C   s   | j sdS |
stt dd }
z| j  }|d|
|||||||||	f
 | j   |jW S  tyI } zt	d|  W Y d}~dS d}~ww )u`   
        Arama kaydı ekle.
        
        Returns:
            Eklenen kaydın ID'si
        r   N   a  
                INSERT INTO search_logs 
                (session_id, brand, model, query_text, query_english, results_count, 
                 top_result_pdf, top_result_page, top_result_score, search_time_ms)
                VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
            u   ⚠️ Arama log hatası: 
r&   r   uuiduuid4r3   r4   r5   	lastrowidr1   r0   )r)   r
   r   r   r   r   r8   r9   r:   r   r	   r3   r2   r   r   r   
log_search   s$   

	zAnalyticsDB.log_searchr   r   r   r   r    r!   r"   safety_warningsr#   c                 C   s   | j sdS |stt dd }z | j  }|d||||||||||	|
|f | j   |jW S  tyK } zt	d|  W Y d}~dS d}~ww )ue   
        Soru-cevap kaydı ekle.
        
        Returns:
            Eklenen kaydın ID'si
        r   Nr<   aE  
                INSERT INTO question_logs 
                (session_id, brand, model, pdf_path, page_number, question, 
                 question_english, answer_english, answer_turkish, confidence, 
                 safety_warnings, response_time_ms)
                VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
            u   ⚠️ Soru log hatası: r=   )r)   r
   r   r   r   r   r   r    r!   r"   rB   r#   r	   r3   r2   r   r   r   log_question   s&   

zAnalyticsDB.log_question
   limitc                 C   J   | j sg S | j  }|r|d||f n|d|f dd | D S )u   En popüler aramaları getirz
                SELECT query_text, COUNT(*) as count, brand, model
                FROM search_logs 
                WHERE brand = ?
                GROUP BY query_text 
                ORDER BY count DESC 
                LIMIT ?
            z
                SELECT query_text, COUNT(*) as count, brand, model
                FROM search_logs 
                GROUP BY query_text 
                ORDER BY count DESC 
                LIMIT ?
            c                 S      g | ]}t |qS r   dict.0rowr   r   r   
<listcomp>      z3AnalyticsDB.get_popular_queries.<locals>.<listcomp>r&   r3   r4   fetchallr)   r
   rE   r3   r   r   r   get_popular_queries     
	zAnalyticsDB.get_popular_queriesc                 C   rF   )u   En popüler soruları getira  
                SELECT question, answer_turkish, COUNT(*) as count, brand, model
                FROM question_logs 
                WHERE brand = ?
                GROUP BY question 
                ORDER BY count DESC 
                LIMIT ?
            z
                SELECT question, answer_turkish, COUNT(*) as count, brand, model
                FROM question_logs 
                GROUP BY question 
                ORDER BY count DESC 
                LIMIT ?
            c                 S   rG   r   rH   rJ   r   r   r   rM   8  rN   z5AnalyticsDB.get_popular_questions.<locals>.<listcomp>rO   rQ   r   r   r   get_popular_questions  rS   z!AnalyticsDB.get_popular_questionsc                 C   s   | j si S | j  }|d | d }|d | d }|d dd | D }|d | d }|d | d }|||||d	S )
zGenel istatistikleri getirz SELECT COUNT(*) FROM search_logsr   z"SELECT COUNT(*) FROM question_logsz
            SELECT brand, COUNT(*) as count 
            FROM search_logs 
            GROUP BY brand 
            ORDER BY count DESC
        c                 S   rG   r   rH   rJ   r   r   r   rM   P  rN   z)AnalyticsDB.get_stats.<locals>.<listcomp>zh
            SELECT COUNT(*) FROM search_logs 
            WHERE DATE(created_at) = DATE('now')
        zj
            SELECT COUNT(*) FROM question_logs 
            WHERE DATE(created_at) = DATE('now')
        )total_searchestotal_questionstoday_searchestoday_questionsbrands)r&   r3   r4   fetchonerP   )r)   r3   rU   rV   rY   rW   rX   r   r   r   	get_stats:  s&   





zAnalyticsDB.get_stats   c           	      C   s   | j sg S | j  }|  }ddd |D }dd |D }|s%g S d| d}|r6|d7 }|| |d| 7 }||| d	d | D S )
uA   Benzer soruları ve cevapları bul (cache olarak kullanılabilir)z OR c                 S   s   g | ]}d qS )zLOWER(question) LIKE ?r   )rK   _r   r   r   rM   p  s    z6AnalyticsDB.find_similar_questions.<locals>.<listcomp>c                 S   s$   g | ]}t |d krd| dqS )   %)len)rK   wr   r   r   rM   q  s   $ z
            SELECT question, answer_turkish, confidence, pdf_path, page_number, brand, model
            FROM question_logs 
            WHERE (z
)
        z AND brand = ?z  ORDER BY created_at DESC LIMIT c                 S   rG   r   rH   rJ   r   r   r   rM     rN   )r&   r3   lowersplitjoinappendr4   rP   )	r)   r   r
   rE   r3   words
conditionsparamsqueryr   r   r   find_similar_questionsg  s"   

z"AnalyticsDB.find_similar_questionsfeedback_typeoriginal_texttranslated_textratinguser_suggestionc	                 C   s   | j sdS |stt dd }z8| j  }	|	d||||||||f | j   |dkrF|rF| j|dd |dd d| d| d	 |	jW S  t	yc }
 zt
d
|
  W Y d}
~
dS d}
~
ww )u  
        Çeviri feedback kaydı ekle.
        
        Args:
            feedback_type: 'search_result' veya 'answer'
            original_text: Orijinal İngilizce metin
            translated_text: Çevrilen Türkçe metin
            rating: 1-5 yıldız
            user_suggestion: Kullanıcının önerdiği doğru çeviri
            
        Returns:
            Eklenen kaydın ID'si
        r   Nr<   z
                INSERT INTO translation_feedback 
                (session_id, feedback_type, original_text, translated_text, 
                 rating, user_suggestion, brand, model)
                VALUES (?, ?, ?, ?, ?, ?, ?, ?)
            r^      user )english_termturkish_termsuggested_bycontextu   ⚠️ Feedback log hatası: )r&   r   r>   r?   r3   r4   r5   add_dictionary_suggestionr@   r1   r0   )r)   rk   rl   rm   rn   ro   r
   r   r	   r3   r2   r   r   r   log_translation_feedback  s2   

	

z$AnalyticsDB.log_translation_feedbackrq   rs   rt   ru   rv   c              
   C   s   | j sdS zA| j  }|d| | f | }|r0|d|d f | j   |d W S |d| | ||f | j   |jW S  ty` } ztd|  W Y d}~dS d}~ww )u   
        Sözlük önerisi ekle veya var olanın oyunu artır.
        
        Returns:
            Eklenen/güncellenen kaydın ID'si
        r   z
                SELECT id, vote_count FROM dictionary_suggestions 
                WHERE LOWER(english_term) = LOWER(?) AND LOWER(turkish_term) = LOWER(?)
            z
                    UPDATE dictionary_suggestions 
                    SET vote_count = vote_count + 1 
                    WHERE id = ?
                z
                    INSERT INTO dictionary_suggestions 
                    (english_term, turkish_term, suggested_by, context)
                    VALUES (?, ?, ?, ?)
                u    ⚠️ Sözlük öneri hatası: N)	r&   r3   r4   striprZ   r5   r@   r1   r0   )r)   rs   rt   ru   rv   r3   existingr2   r   r   r   rw     s0   



z%AnalyticsDB.add_dictionary_suggestion   c                 C   4   | j sg S | j  }|d|f dd | D S )u7   Düşük puanlı çevirileri getir (iyileştirme için)a2  
            SELECT original_text, translated_text, rating, user_suggestion, 
                   COUNT(*) as count, brand, model
            FROM translation_feedback 
            WHERE rating <= 2
            GROUP BY original_text 
            ORDER BY count DESC, rating ASC
            LIMIT ?
        c                 S   rG   r   rH   rJ   r   r   r   rM      rN   z:AnalyticsDB.get_low_rated_translations.<locals>.<listcomp>rO   r)   rE   r3   r   r   r   get_low_rated_translations  s   

z&AnalyticsDB.get_low_rated_translations2   c                 C   r|   )u)   Onay bekleyen sözlük önerilerini getirz
            SELECT id, english_term, turkish_term, vote_count, context, created_at
            FROM dictionary_suggestions 
            WHERE is_approved = 0
            ORDER BY vote_count DESC
            LIMIT ?
        c                 S   rG   r   rH   rJ   r   r   r   rM     rN   z7AnalyticsDB.get_pending_suggestions.<locals>.<listcomp>rO   r}   r   r   r   get_pending_suggestions  s   
z#AnalyticsDB.get_pending_suggestionssuggestion_idc                 C   s@   | j sdS z| j  }|d|f | j   W dS    Y dS )u   Sözlük önerisini onaylaFz~
                UPDATE dictionary_suggestions 
                SET is_approved = 1 
                WHERE id = ?
            T)r&   r3   r4   r5   )r)   r   r3   r   r   r   approve_suggestion  s   

zAnalyticsDB.approve_suggestionc                 C   s   | j si S | j  }|d | d pd}|d dd | D }|d | d }|d | d }|d | d }t|d	||||d
S )zFeedback istatistikleriz,SELECT AVG(rating) FROM translation_feedbackr   z
            SELECT rating, COUNT(*) as count 
            FROM translation_feedback 
            GROUP BY rating 
            ORDER BY rating
        c                 S   s   i | ]	}|d  |d qS )r      r   rJ   r   r   r   
<dictcomp>5  s    z2AnalyticsDB.get_feedback_stats.<locals>.<dictcomp>z)SELECT COUNT(*) FROM translation_feedbackz+SELECT COUNT(*) FROM dictionary_suggestionszASELECT COUNT(*) FROM dictionary_suggestions WHERE is_approved = 1r^   )average_ratingrating_distributiontotal_feedbacktotal_suggestionsapproved_suggestions)r&   r3   r4   rZ   rP   round)r)   r3   
avg_ratingrating_distr   r   r   r   r   r   get_feedback_stats#  s&   





zAnalyticsDB.get_feedback_statsc                 C   s   | j r| j   d| _ dS dS )u   Bağlantıyı kapatN)r&   close)r)   r   r   r   r   K  s   

zAnalyticsDB.close)r6   r   r6   r   r7   r   N)r6   r6   r6   r6   r6   r   N)NrD   )Nr\   )r6   r6   r6   N)rq   r6   )r{   )r   )r   r   r   r   DB_PATHr   r*   r'   r(   r   floatrA   rC   r   r   rR   rT   r[   rj   rx   rw   r~   r   boolr   r   r   r   r   r   r   r$   ;   s    
_	

1	

. -$	

=
2(r$   __main__JCBJS330u   hidrolik pompa arızasızhydraulic pump failurerD   i  )r
   r   r   r   r   r   z/mnt/pdfs/JCB/JS330/service.pdfi  u   relief valve basıncı ne?z"what is the relief valve pressure?z%The relief valve pressure is 350 bar.u%   Emniyet valfi basıncı 350 bar'dır.high)	r
   r   r   r   r   r   r    r!   r"   u   
📊 İstatistikler:u   
🔍 Popüler Aramalar:)r   osr,   r>   r   typingr   r   r   dataclassesr   pathrd   dirname__file__r   r   r   r$   r   dbrA   rC   r0   r[   rR   r   r   r   r   r   <module>   sX       	