import os
from dotenv import load_dotenv
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, Session
from typing import Generator
import uuid
from datetime import datetime
import random
import string

load_dotenv(override=True)

DB_HOST = os.environ.get("DB_HOST", "localhost")
DB_PORT = os.environ.get("DB_PORT", "5432")
DB_NAME = os.environ.get("DB_NAME", "")
DB_USER = os.environ.get("DB_USER", "")
DB_PASSWORD = os.environ.get("DB_PASSWORD", "")
DATABASE_URL = f"postgresql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}"
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()

def get_db() -> Generator:
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

def generate_booking_reference() -> str:
    """Generate a unique 10-character alphanumeric booking reference."""
    chars = string.ascii_uppercase + string.digits
    return ''.join(random.choices(chars, k=10))

def generate_ticket_number() -> str:
    """Generate a unique 12-character alphanumeric ticket number."""
    chars = string.ascii_uppercase + string.digits
    return 'TKT' + ''.join(random.choices(chars, k=9))

def generate_qr_code(ticket_id: str, booking_reference: str) -> str:
    """Generate a QR code string for ticket verification."""
    return f"QR-{ticket_id}-{booking_reference}"