import pyignite3_dbapi
from pyignite3_dbapi import DatabaseError

def create_simple_connection():
  """Create a basic connection to Ignite cluster."""
  addr = ['127.0.0.1:10800']
  return pyignite3_dbapi.connect(address=addr, timeout=10)

def create_ssl_connection():
  """Create SSL-enabled connection to Ignite cluster."""
  addr = ['127.0.0.1:10800']
  return pyignite3_dbapi.connect(
      address=addr,
      timeout=10,
      use_ssl=True,
      ssl_keyfile='<path_to_ssl_keyfile.pem>',
      ssl_certfile='<path_to_ssl_certfile.pem>',
      # Optional: ssl_ca_certfile='<path_to_ssl_ca_certfile.pem>'
  )

def create_authenticated_connection():
  """Create authenticated connection to Ignite cluster."""
  addr = ['127.0.0.1:10800']
  return pyignite3_dbapi.connect(
      address=addr,
      timeout=10,
      identity='user',
      secret='password'
  )

def basic_operations_example():
  """Demonstrate basic CRUD operations."""
  with create_simple_connection() as conn:
    with conn.cursor() as cursor:
      try:
        # Drop table if exists (for clean runs)
        cursor.execute('DROP TABLE IF EXISTS Person')

        # Create table
        cursor.execute('''
                  CREATE TABLE Person(
                      id INT PRIMARY KEY, 
                      name VARCHAR, 
                      age INT
                  )
              ''')

        # Sample data
        sample_data = [
          [1, "John", 30],
          [2, "Jane", 32],
          [3, "Bob", 28]
        ]

        # Insert data (fixed table name)
        cursor.executemany('INSERT INTO Person VALUES(?, ?, ?)', sample_data)

        # Query data
        cursor.execute('SELECT * FROM Person ORDER BY id')
        results = cursor.fetchall()

        print("All persons in database:")
        for row in results:
          print(f"ID: {row[0]}, Name: {row[1]}, Age: {row[2]}")

        # Query specific record
        cursor.execute('SELECT name, age FROM Person WHERE id = ?', [2])
        person = cursor.fetchone()
        if person:
          print(f"\nFound person: {person[0]}, age {person[1]}")
      except Exception as e:
        print(f"Database error: {e}")


def transaction_example():
  """Demonstrate transaction handling with proper rollback scenarios."""
  conn = create_simple_connection()

  try:
    # Disable autocommit for manual transaction control
    conn.autocommit = False

    with conn.cursor() as cursor:
      try:
        # Insert valid records
        cursor.execute('INSERT INTO Person VALUES(?, ?, ?)', [4, "Alice", 29])
        cursor.execute('INSERT INTO Person VALUES(?, ?, ?)', [5, "Charlie", 31])

        # Simulate a business logic check that fails
        # (e.g., age validation, duplicate check, etc.)
        new_age = 150  # Invalid age
        if new_age > 120:
          raise ValueError("Age validation failed: unrealistic age")

        cursor.execute('INSERT INTO Person VALUES(?, ?, ?)', [6, "Invalid", new_age])

        # If we get here, commit all changes
        conn.commit()
        print("Transaction committed successfully")

      except Exception as e:
        # Rollback on any error
        conn.rollback()
        print(f"Transaction rolled back due to error: {e}")

      # Verify what's actually in the database
      cursor.execute('SELECT COUNT(*) FROM Person')
      count = cursor.fetchone()[0]
      print(f"Total persons in database: {count}")

  except Exception as e:
    print(f"Connection error: {e}")
  finally:
    conn.close()

def connection_examples():
  """Show different connection types."""
  print("=== Connection Examples ===")

  # Basic connection
  print("1. Basic connection:")
  with create_simple_connection() as basic_conn:
    print(f"   Connected: {basic_conn is not None}")

  # Note: SSL and auth connections would be created similarly
  # but require actual certificates/credentials to test
  print("2. SSL and authenticated connections available via helper functions")

def main():
  """Main function demonstrating Ignite DB API usage."""
  print("Ignite DB API Example")
  print("=" * 30)

  try:
    connection_examples()
    print("\n=== Basic Operations ===")
    basic_operations_example()
    print("\n=== Transaction Handling ===")
    transaction_example()

  except Exception as e:
    print(f"Application error: {e}")

if __name__ == "__main__":
  main()