"""Generate a basic ModelView class for each table in the database."""

import socket

import psycopg

# Determine whether connecting from on/off campus
try:
    socket.gethostbyname("data.cs.jmu.edu")
    HOST = "data.cs.jmu.edu"
except socket.gaierror:
    HOST = "localhost"

# Get all tables and their columns
with psycopg.connect(
    host=HOST, user="tamassno", dbname="sec2", password="113880616"
) as conn:
    with conn.cursor() as cur:
        cur.execute(
            """
            SELECT table_name, column_name
            FROM information_schema.columns
            WHERE table_schema = 'tamassno'
              AND table_name NOT LIKE 'ab_%'
            ORDER BY table_name, ordinal_position;
        """
        )
        schema = cur.fetchall()

# Build a dictionary of results by table
tables: dict[str, list[str]] = {}
for table_name, column_name in schema:
    tables.setdefault(table_name, []).append(column_name)

# Generate Flask-AppBuilder ModelView classes
for table, columns in tables.items():
    name = table.capitalize()
    print(f"class {name}(ModelView):")
    print(f"    datamodel = SQLAInterface(models.{name})")
    print(f"    route_base = '/{table}'")
    print(f"    list_title = '{name}s'")
    print(f"    list_columns = {columns}")
    print()

# Generate code to add each view to the app
for table in tables:
    name = table.capitalize()
    print("appbuilder.add_view(")
    print(f"    {name},")
    print(f'    "{name}s",')
    print('    icon="fa-database",')
    print('    category="Admin",')
    print(")")
    print()
