from elasticsearch import Elasticsearch
from langchain.embeddings import HuggingFaceEmbeddings
from elasticsearch.helpers import bulk
import json

# Настройка подключения к Elasticsearch с аутентификацией и HTTPS
es = Elasticsearch(
    [{'host': 'localhost', 'port': 9200, 'scheme': 'https'}],
    http_auth=('elastic', '3lvFhvVYrazLsj=M-R_g'),  # замените на ваш пароль
    verify_certs=False  # Отключить проверку SSL-сертификата, если используется самоподписанный сертификат
)

embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")

def create_index():
    # Определяем маппинг для индекса
    mapping = {
        "mappings": {
            "properties": {
                "text": {
                    "type": "text",
                    "analyzer": "standard"
                },
                "vector": {
                    "type": "dense_vector",
                    "dims": 384  # Размерность векторного представления
                },
                "full_data": {
                    "type": "object",
                    "enabled": False  # Отключаем индексацию вложенных данных
                }
            }
        }
    }
    es.indices.create(index='drug_docs', body=mapping, ignore=400)

def load_drug_data(json_path):
    with open(json_path, 'r', encoding='utf-8') as f:
        data = json.load(f)
    return data

def index_documents(data):
    actions = []
    total_docs = len(data)
    for i, item in enumerate(data, start=1):
        doc_text = f"{item['link']} {item.get('pribalovy_letak', '')} {item.get('spc', '')}"

        vector = embeddings.embed_query(doc_text)

        action = {
            "_index": "drug_docs",
            "_id": i,
            "_source": {
                'text': doc_text,
                'vector': vector,
                'full_data': item
            }
        }
        actions.append(action)

        # Отображение прогресса
        print(f"Индексируется документ {i}/{total_docs}", end='\r')

        # Опционально: индексируем пакетами по N документов
        if i % 100 == 0 or i == total_docs:
            bulk(es, actions)
            actions = []

    # Если остались неиндексированные документы
    if actions:
        bulk(es, actions)

    print("\nИндексирование завершено.")

if __name__ == "__main__":
    create_index()
    data_path = "../../esDB/cleaned_general_info_additional.json"
    drug_data = load_drug_data(data_path)
    index_documents(drug_data)