
    %<i                         d Z ddlZddlZddlmZ ddlmZ ddlmZm	Z	 ddl
mZmZ dZdZd	efd
Z	 	 ddededededz  deeef   dz  d	efdZded	efdZded	dfdZy)a  
ingest.py - Document ingestion pipeline for knowledge base.

Responsibilities:
- Compute SHA-256 content_hash for deduplication
- Chunk text via chunker.chunk_text()
- Generate embeddings via embedding_service.get_embeddings_batch()
- Persist documents and chunks to Supabase
    N)Any)
chunk_text)get_embeddingget_embeddings_batch)Clientcreate_clientknowledge_documentsknowledge_chunksreturnc                  8   t         j                  j                  d      xs t         j                  j                  d      } t         j                  j                  d      xs t         j                  j                  d      }| r|st        d      t	        | |      S )u   환경변수에서 Supabase 클라이언트를 생성하여 반환한다.

    Raises:
        ValueError: 필수 환경변수가 설정되지 않은 경우.
    INSURO_SUPABASE_URLINSURO_NEW_SUPABASE_URLINSURO_NEW_SERVICE_ROLE_KEY INSURO_SUPABASE_SERVICE_ROLE_KEYzFSupabase URL and service role key must be set in environment variables)osenvironget
ValueErrorr   )urlkeys     </home/jay/workspace/.worktrees/task-2057-dev2/libs/ingest.py_get_supabase_clientr      su     jjnn%:;hrzz~~Ng?hCjjnn%BC rzz~~*HC cabbc""    titlecontentsource
source_urlmetadatac           
         |r|j                         st        d      t        j                  |j	                  d            j                         }t               }|j                  t              j                  d      j                  d|      j                         }|j                  r|j                  }t        |d   d         S t        |      }	|	D 
cg c]  }
t        |
d          }}
t        |      }| |||d}|||d<   |||d	<   |j                  t              j!                  |      j                         }|j                  }t        |d   d         }t#        t%        |	            D cg c]:  }|t        |	|   d         t'        |	|   d
         t'        |	|   d         ||   d< }}|j                  t(              j!                  |      j                          |S c c}
w c c}w )u  문서를 인제스트하여 knowledge base에 저장하고 document_id를 반환한다.

    Steps:
    1. content 유효성 검사
    2. content_hash(SHA-256) 계산
    3. 중복 문서 확인 → 존재하면 기존 document_id 반환
    4. chunk_text() → get_embeddings_batch() → Supabase INSERT

    Args:
        title: 문서 제목.
        content: 문서 본문 텍스트.
        source: 문서 출처 식별자.
        source_url: 문서 원본 URL (선택).
        metadata: 추가 메타데이터 dict (선택).

    Returns:
        document_id (str, UUID 형식).

    Raises:
        ValueError: content가 비어 있거나 공백만 있는 경우.
    z"content must be a non-empty stringzutf-8idcontent_hashr   r   )r   r   r   r!   r   r   chunk_indextoken_countdocument_idr   r"   r#   	embedding)stripr   hashlibsha256encode	hexdigestr   table_DOCUMENTS_TABLEselecteqexecutedatastrr   r   insertrangelenint_CHUNKS_TABLE)r   r   r   r   r   r!   clientexistingr1   chunkscchunk_texts
embeddingsdoc_row
doc_resultdoc_datar%   i
chunk_rowss                      r   ingest_documentrC   /   s   8 '--/=>>w~~g'>?IIKL)+F ||,-44T:==nl[cceH}}%-]]474=!! *4G)<F :@@Ac!I,/@K@$8$EJ $	G  *&
./66w?GGIJ%/__H8A;t,-K s6{#	(  '6!9Y/0vay78vay78#A	
	(J 	( LL&&z2::<A A(	(s   G%0?G*r%   c                     	 t               }|j                  t              j                         j	                  d|       j                          y# t        $ r Y yw xY w)u   Supabase에서 문서를 삭제한다 (CASCADE로 chunks도 삭제됨).

    Args:
        document_id: 삭제할 문서의 UUID 문자열.

    Returns:
        성공 시 True, 실패 시 False.
    r    TF)r   r,   r-   deleter/   r0   	Exception)r%   r8   s     r   delete_documentrG      sP    -/%&--/224EMMO s   AA 	AAc           
         t               }|j                  t              j                         j	                  d|       j                          |j                  t              j                  d      j	                  d|       j                         }|j                  st        d|        |j                  d   }t        |d         }t        |      }|D cg c]  }t        |d          }}t        |      }t        t        |            D 	cg c]:  }	| t        ||	   d         t        ||	   d         t        ||	   d         ||	   d	< }
}	|j                  t              j!                  |
      j                          y
c c}w c c}	w )u  문서의 청크를 삭제하고 재청킹·재임베딩·재삽입한다.

    Steps:
    1. 기존 chunks 삭제
    2. 문서 content 재조회
    3. chunk_text() → get_embeddings_batch() → chunks INSERT

    Args:
        document_id: 재인덱스할 문서의 UUID 문자열.

    Raises:
        ValueError: 해당 document_id의 문서가 존재하지 않는 경우.
    r%   z0id, title, content, source, source_url, metadatar    zDocument not found: r   r   r"   r#   r$   N)r   r,   r7   rE   r/   r0   r-   r.   r1   r   r2   r   r   r4   r5   r6   r3   )r%   r8   r?   docr   r:   r;   r<   r=   rA   rB   s              r   reindex_documentrJ      sn    *+F LL&&(++M;GOOQ 	%&	B	C	D+			  ??/}=>>$//!,Cs9~&G *4G)<F :@@Ac!I,/@K@$8$EJ s6{#	(  '6!9Y/0vay78vay78#A	
	(J 	( LL&&z2::< A	(s   F ?F)NN)__doc__r(   r   typingr   chunkerr   embedding_servicer   r   supabaser   r   r-   r7   r   r2   dictrC   boolrG   rJ    r   r   <module>rS      s     	   A * ) "#f #0 "&*MMM M d
	M
 38nt#M 	M`  "2=# 2=$ 2=r   