o
    h                     @   s   d dl mZmZ d dlmZ d dlmZ d dlmZ dd Z	dee fdd	Z
d
ee fddZded
ee fddZd!dedee fddZdedee fddZdedededefddZdefddZd S )"    )ListDict)HTTPException)logger)database_yokohamac               
      sz   zd} d}t j| dI dH  t j|dI dH  td W dS  ty< } ztd|  tdd| d	d}~ww )
u   
    // book_rankingsとkeywordsテーブルの全データを削除（初期化）します。
    // TRUNCATE TABLEを使い、データを高速に削除しIDもリセットします。
    zTRUNCATE TABLE book_rankings;zTRUNCATE TABLE keywords;)queryNz8Tables 'book_rankings' and 'keywords' have been cleared.zError clearing tables:   
DB Error: status_codedetailr   executer   info	Exceptionerrorr   )query_rankingsquery_keywordse r   $/home/air/yokohama/back/db_module.pyclear_ranking_data   s   r   rankingsc              
      s   | sdS dd | D }zd}t j||dI dH  tdt| d W dS  tyC } ztd|  td	d
| dd}~ww )uo   
    // スクレイピングで取得した複数の書籍の基本情報をMySQL DBに保存します。
    Nc                 S   s"   g | ]}|d  | dddqS )titlesourcerakuten)r   r   )get).0rr   r   r   
<listcomp>   s    z&save_book_rankings.<locals>.<listcomp>zk
            INSERT IGNORE INTO book_rankings (title, source)
            VALUES (:title, :source)
        r   valueszSaved or ignored z book rankings in MySQL.z4Error during bulk insert of book rankings to MySQL: r   r	   r
   )r   execute_manyr   r   lenr   r   r   )r   values_to_insertr   r   r   r   r   save_book_rankings   s   r%   keywordsc              
      sr   | sdS zdd | D }d}t j||dI dH  W dS  ty8 } ztd|  tdd| d	d}~ww )
u   
    // [修正] キーワードリストを`keywords`テーブルに保存します。
    // `link_keywords_to_book`からこの機能だけを分離しました。
    Nc                 S   s   g | ]}d |iqS keywordr   )r   kwr   r   r   r   5       z&save_keywords_list.<locals>.<listcomp>z7INSERT IGNORE INTO keywords (keyword) VALUES (:keyword)r    z%Error saving keywords list to MySQL: r   r	   r
   )r   r"   r   r   r   r   )r&   r!   r   r   r   r   r   save_keywords_list,   s   r+   r   c              
      sz   |sdS d |}zd}tj||| ddI dH  W dS  ty< } ztd|  d|  tdd	| d
d}~ww )u   
    // [新規] 書籍のタイトルを基準に、`book_rankings`テーブルの`keyword`カラムを更新します。
    // これが本来この関数名が担うべき役割です。
    N,zV
            UPDATE book_rankings SET keyword = :keyword WHERE title = :title
        )r(   r   r!   zError linking keywords to 'z' in MySQL: r   r	   r
   )joinr   r   r   r   r   r   )r   r&   keywords_strr   r   r   r   r   link_keywords_to_book=   s   
 r0      limitreturnc              
      sh   zd}t j|d| idI dH }dd |D W S  ty3 } ztd|  g W  Y d}~S d}~ww )uh   
    // `keywords`テーブルから重複なくランダムにキーワードを取得します。
    z
            SELECT keyword FROM keywords
            WHERE keyword IS NOT NULL AND keyword != ''
            GROUP BY keyword
            ORDER BY RAND()
            LIMIT :limit
        r2   r-   Nc                 S   s   g | ]}|d  qS r'   r   )r   rowr   r   r   r   \   r*   z'get_random_keywords.<locals>.<listcomp>z Error fetching random keywords: r   	fetch_allr   r   r   )r2   r   resultsr   r   r   r   get_random_keywordsO   s   r8   
session_idc              
      s`   zd}t j|d| idI dH W S  ty/ } ztd|  d|  g W  Y d}~S d}~ww )uR   
    // 指定されたsession_idの会話履歴をDBから取得します。
    z
            SELECT user_message, assistant_response, status
            FROM chat_history
            WHERE session_id = :session_id AND status != '99'
            ORDER BY sort_order ASC
        r9   r-   Nz+Error fetching chat history for session_id : r5   r9   r   r   r   r   r   get_chat_historyf   s   r<   
chat_tokenstatusmessageresponsec           
   
      s   z/d}t j|d| idI dH }|d pdd }d}| |t|||d	}t j||dI dH  W dS  tyP }	 ztd
|  d|	  tdd|	 dd}	~	ww )u=   
    // 1回の対話ターンをDBに保存します。
    zTSELECT MAX(sort_order) as max_order FROM chat_history WHERE session_id = :session_idr9   r-   N	max_orderr      z
            INSERT INTO chat_history (session_id, sort_order, status, user_message, assistant_response)
            VALUES (:session_id, :sort_order, :status, :user_message, :assistant_response)
        )r9   
sort_orderr>   user_messageassistant_responsez&Error saving chat turn for session_id r:   r   r	   r
   )r   	fetch_onestrr   r   r   r   r   )
r=   r>   r?   r@   sort_order_querylast_order_result
next_orderinsert_queryr!   r   r   r   r   save_chat_messagev   s$   rL   c              
      sx   zd}t j|d| idI dH  td|  d W dS  ty; } ztd|  d|  td	d
| dd}~ww )uS   
    // 指定されたsession_idの会話履歴をすべて削除します。
    z7DELETE FROM chat_history WHERE session_id = :session_idr9   r-   NzChat history for session z has been cleared.z(Error deleting chat history for session r:   r   r	   r
   r   r;   r   r   r   delete_chat_history   s   rM   N)r1   )typingr   r   fastapir   configr   dbr   r   r%   rG   r+   r0   intr8   r<   rL   rM   r   r   r   r   <module>   s    