import psycopg2

# Database connection
dsn = 'postgresql://local-Python:Neo-local-1991125@100.64.0.4:5432/LLZQ-test'

conn = psycopg2.connect(dsn)
cur = conn.cursor()

print('=' * 80)
print('1. ALL SCHEMAS')
print('=' * 80)
cur.execute("""
SELECT schema_name FROM information_schema.schemata 
WHERE schema_name NOT IN ('pg_catalog', 'information_schema', 'pg_toast')
ORDER BY schema_name;
""")
for row in cur.fetchall():
    print(row[0])

print()
print('=' * 80)
print('2. TABLES IN BUSINESS SCHEMAS')
print('=' * 80)
cur.execute("""
SELECT table_schema, table_name, table_type
FROM information_schema.tables 
WHERE table_schema IN ('billiards', 'billiards_ods', 'billiards_dwd', 'billiards_dws', 'etl_admin')
ORDER BY table_schema, table_name;
""")
print(f"{'Schema':<20} {'Table Name':<50} {'Type':<15}")
print('-' * 85)
for row in cur.fetchall():
    print(f"{row[0]:<20} {row[1]:<50} {row[2]:<15}")

print()
print('=' * 80)
print('3. COLUMN DETAILS FOR billiards_dwd SCHEMA')
print('=' * 80)
cur.execute("""
SELECT 
    c.table_schema,
    c.table_name,
    c.column_name,
    c.data_type,
    c.character_maximum_length,
    c.numeric_precision,
    c.numeric_scale,
    c.is_nullable,
    c.column_default,
    c.ordinal_position
FROM information_schema.columns c
WHERE c.table_schema = 'billiards_dwd'
ORDER BY c.table_name, c.ordinal_position;
""")
current_table = None
for row in cur.fetchall():
    if current_table != row[1]:
        current_table = row[1]
        print()
        print(f"Table: {row[0]}.{row[1]}")
        print(f"{'#':<4} {'Column':<35} {'Data Type':<25} {'Nullable':<10} {'Default':<30}")
        print('-' * 110)
    
    data_type = row[3]
    if row[4]:  # character_maximum_length
        data_type += f"({row[4]})"
    elif row[5] and row[6]:  # numeric precision and scale
        data_type += f"({row[5]},{row[6]})"
    elif row[5]:
        data_type += f"({row[5]})"
    
    default_val = str(row[8])[:28] if row[8] else ''
    print(f"{row[9]:<4} {row[2]:<35} {data_type:<25} {row[7]:<10} {default_val:<30}")

print()
print('=' * 80)
print('4. PRIMARY KEYS IN billiards_dwd')
print('=' * 80)
cur.execute("""
SELECT 
    tc.table_schema,
    tc.table_name,
    kcu.column_name
FROM information_schema.table_constraints tc
JOIN information_schema.key_column_usage kcu 
    ON tc.constraint_name = kcu.constraint_name
    AND tc.table_schema = kcu.table_schema
WHERE tc.constraint_type = 'PRIMARY KEY'
AND tc.table_schema = 'billiards_dwd'
ORDER BY tc.table_name, kcu.ordinal_position;
""")
print(f"{'Schema':<20} {'Table Name':<40} {'PK Column':<30}")
print('-' * 90)
for row in cur.fetchall():
    print(f"{row[0]:<20} {row[1]:<40} {row[2]:<30}")

print()
print('=' * 80)
print('5. TABLE COMMENTS IN billiards_dwd')
print('=' * 80)
cur.execute("""
SELECT 
    n.nspname AS schema_name,
    c.relname AS table_name,
    d.description AS table_comment
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
LEFT JOIN pg_description d ON d.objoid = c.oid AND d.objsubid = 0
WHERE n.nspname = 'billiards_dwd' AND c.relkind = 'r'
ORDER BY c.relname;
""")
print(f"{'Schema':<20} {'Table Name':<40} {'Comment':<50}")
print('-' * 110)
for row in cur.fetchall():
    comment = row[2] if row[2] else '(no comment)'
    print(f"{row[0]:<20} {row[1]:<40} {comment:<50}")

print()
print('=' * 80)
print('6. COLUMN COMMENTS IN billiards_dwd')
print('=' * 80)
cur.execute("""
SELECT 
    n.nspname AS schema_name,
    c.relname AS table_name,
    a.attname AS column_name,
    d.description AS column_comment
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
JOIN pg_attribute a ON a.attrelid = c.oid
LEFT JOIN pg_description d ON d.objoid = c.oid AND d.objsubid = a.attnum
WHERE n.nspname = 'billiards_dwd' 
    AND c.relkind = 'r'
    AND a.attnum > 0
    AND NOT a.attisdropped
ORDER BY c.relname, a.attnum;
""")
current_table = None
for row in cur.fetchall():
    if current_table != row[1]:
        current_table = row[1]
        print()
        print(f"Table: {row[0]}.{row[1]}")
        print(f"{'Column':<35} {'Comment':<60}")
        print('-' * 95)
    comment = row[3] if row[3] else '(no comment)'
    print(f"{row[2]:<35} {comment:<60}")

conn.close()
print()
print('=' * 80)
print('Query completed successfully!')
print('=' * 80)
