#!/usr/bin/env python3
"""Verify migration data in Neo4j."""

import json
import os

from neo4j import GraphDatabase

NEO4J_URI = 'bolt://192.168.1.25:7687'
NEO4J_USER = 'neo4j'
NEO4J_PASSWORD = '!"MiTa1205'

TARGET_DATABASE = 'graphiti'
TARGET_GROUP_ID = '6910959f2128b5c4faa22283'

driver = GraphDatabase.driver(NEO4J_URI, auth=(NEO4J_USER, NEO4J_PASSWORD))

print('=' * 70)
print('Verifying Migration Data')
print('=' * 70)

with driver.session(database=TARGET_DATABASE) as session:
    # Check total nodes
    result = session.run(
        """
        MATCH (n {group_id: $group_id})
        RETURN count(n) as total
    """,
        group_id=TARGET_GROUP_ID,
    )

    total = result.single()['total']
    print(f"\n✓ Total nodes with group_id '{TARGET_GROUP_ID}': {total}")

    # Check node labels and properties
    result = session.run(
        """
        MATCH (n {group_id: $group_id})
        RETURN DISTINCT labels(n) as labels, count(*) as count
        ORDER BY count DESC
    """,
        group_id=TARGET_GROUP_ID,
    )

    print(f'\n✓ Node types:')
    for record in result:
        labels = ':'.join(record['labels'])
        count = record['count']
        print(f'   {labels}: {count}')

    # Sample some episodic nodes
    result = session.run(
        """
        MATCH (n:Episodic {group_id: $group_id})
        RETURN n.uuid as uuid, n.name as name, n.content as content, n.created_at as created_at
        LIMIT 5
    """,
        group_id=TARGET_GROUP_ID,
    )

    print(f'\n✓ Sample Episodic nodes:')
    episodes = list(result)
    if episodes:
        for record in episodes:
            print(f'   - {record["name"]}')
            print(f'     UUID: {record["uuid"]}')
            print(f'     Created: {record["created_at"]}')
            print(f'     Content: {record["content"][:100] if record["content"] else "None"}...')
    else:
        print('   ⚠️  No episodic nodes found!')

    # Sample some entity nodes
    result = session.run(
        """
        MATCH (n:Entity {group_id: $group_id})
        RETURN n.uuid as uuid, n.name as name, labels(n) as labels, n.summary as summary
        LIMIT 10
    """,
        group_id=TARGET_GROUP_ID,
    )

    print(f'\n✓ Sample Entity nodes:')
    entities = list(result)
    if entities:
        for record in entities:
            labels = ':'.join(record['labels'])
            print(f'   - {record["name"]} ({labels})')
            print(f'     UUID: {record["uuid"]}')
            if record['summary']:
                print(f'     Summary: {record["summary"][:80]}...')
    else:
        print('   ⚠️  No entity nodes found!')

    # Check relationships
    result = session.run(
        """
        MATCH (n {group_id: $group_id})-[r]->(m {group_id: $group_id})
        RETURN type(r) as rel_type, count(*) as count
        ORDER BY count DESC
        LIMIT 10
    """,
        group_id=TARGET_GROUP_ID,
    )

    print(f'\n✓ Relationship types:')
    rels = list(result)
    if rels:
        for record in rels:
            print(f'   {record["rel_type"]}: {record["count"]}')
    else:
        print('   ⚠️  No relationships found!')

    # Check if nodes have required properties
    result = session.run(
        """
        MATCH (n:Episodic {group_id: $group_id})
        RETURN
            count(n) as total,
            count(n.uuid) as has_uuid,
            count(n.name) as has_name,
            count(n.content) as has_content,
            count(n.created_at) as has_created_at,
            count(n.valid_at) as has_valid_at
    """,
        group_id=TARGET_GROUP_ID,
    )

    props = result.single()
    print(f'\n✓ Episodic node properties:')
    print(f'   Total: {props["total"]}')
    print(f'   Has uuid: {props["has_uuid"]}')
    print(f'   Has name: {props["has_name"]}')
    print(f'   Has content: {props["has_content"]}')
    print(f'   Has created_at: {props["has_created_at"]}')
    print(f'   Has valid_at: {props["has_valid_at"]}')

    # Check Entity properties
    result = session.run(
        """
        MATCH (n:Entity {group_id: $group_id})
        RETURN
            count(n) as total,
            count(n.uuid) as has_uuid,
            count(n.name) as has_name,
            count(n.summary) as has_summary,
            count(n.created_at) as has_created_at
    """,
        group_id=TARGET_GROUP_ID,
    )

    props = result.single()
    print(f'\n✓ Entity node properties:')
    print(f'   Total: {props["total"]}')
    print(f'   Has uuid: {props["has_uuid"]}')
    print(f'   Has name: {props["has_name"]}')
    print(f'   Has summary: {props["has_summary"]}')
    print(f'   Has created_at: {props["has_created_at"]}')

driver.close()
print('\n' + '=' * 70)
