import psycopg2
from sentence_transformers import SentenceTransformer

# 1. povrzuvanje so vidi_db
try:
    conn = psycopg2.connect(
        dbname="vidi_db",
        user="postgres",
        password="...",
        host="localhost",
        port="5432"
    )
    cursor = conn.cursor()
    print("Успешно поврзување со локалната vidi_db!")
except Exception as e:
    print(f"Грешка при поврзување со базата: {e}")
    exit()

# 2. Vcituvanje na NLP modelot za gen vektori
print("Се вчитува моделот за embeddings...")
model = SentenceTransformer('all-MiniLM-L6-v2')

try:
    print("Ги влечам и ги групирам коментарите по содржина од локалната база...")
    query = """
        SELECT r.ContentContentID, m.title, STRING_AGG(r.Comment, ' ') as all_reviews
        FROM "review" r
        JOIN "media" m ON m.contentid = r.ContentContentID
        GROUP BY r.ContentContentID, m.title;
    """
    cursor.execute(query)
    rows = cursor.fetchall()

    if not rows:
        print("Нема нови филмови со коментари кои чекаат за вектор.")
    else:
        print(f"Пронајдени се {len(rows)} филмови за обработка на коментари...")

        updated_count = 0
        for row in rows:
            content_id = row[0]
            title = row[1]
            all_reviews = row[2] if row[2] else ""

            combined_context = f"{title}. Reviews: {all_reviews}"

            embedding_vector = model.encode(combined_context).tolist()
            truncated_vector = embedding_vector[:4]  # Сечеме на 4 димензии за vector(4)

            cursor.execute(
                'UPDATE "media" SET embedding = %s WHERE contentid = %s;',
                (truncated_vector, content_id)
            )
            updated_count += 1

            if updated_count % 100 == 0:
                print(f"  Процесирани {updated_count} филмови локално...")

        conn.commit()
        print(f"\nУспешно ажурирани {updated_count} записи во локалната табела Media!")

except Exception as e:
    print(f"Настана грешка при работа со локалната база: {e}")
    conn.rollback()
finally:
    cursor.close()
    conn.close()
    print("Врската со локалниот Postgres е затворена.")