# admin.py
import logging
from flask import redirect, url_for
from flask_login import current_user
from flask_admin.contrib.sqla import ModelView
from sqlalchemy import text
from sqlalchemy.ext.automap import automap_base

__all__ = ["init_admin"]

def init_admin(app, admin, engine, SessionLocal):
    """
    Wire up Flask-Admin to your existing MySQL schema using SQLAlchemy automap.
    - Relies on *your* existing login (/admin/login) and Admin(...) instance.
    - Does NOT create its own Flask app, login manager, or Admin() object.
    """

    log = app.logger or logging.getLogger(__name__)

    # ---- Reflect DB schema ----
    Base = automap_base()
    try:
        with engine.connect() as c:
            c.execute(text("SELECT 1"))
        Base.prepare(autoload_with=engine)
        log.info("Automapped classes: %s", list(Base.classes.keys()))
    except Exception:
        log.exception("Admin DB reflection failed. Skipping admin mount.")
        return None

    C = Base.classes
    AppSettings           = getattr(C, "app_settings", None)
    PhaseContent          = getattr(C, "phase_content", None)
    PhasePromptAssignment = getattr(C, "phase_prompt_assignment", None)
    PromptTemplates       = getattr(C, "prompt_templates", None)
    PromptMessages        = getattr(C, "prompt_messages", None)
    SessionFeedback       = getattr(C, "session_feedback", None)

    # ---- Secured base view (uses your DB-backed current_user.is_admin) ----
    class SecuredModelView(ModelView):
        can_view_details = True
        can_export = True
        page_size = 50
        column_display_pk = True

        def is_accessible(self):
            return current_user.is_authenticated and getattr(current_user, "is_admin", False)

        def inaccessible_callback(self, name, **kwargs):
            return redirect(url_for("admin_login"))

        def get_session(self):
            return SessionLocal

    # ---- Per-table view customizations ----
    class AppSettingsView(SecuredModelView):
        column_searchable_list = ["app_id"]
        column_filters = ["app_id"]

    class PhaseContentView(SecuredModelView):
        column_searchable_list = ["section_label", "instruction_text", "question_text", "sound_tags", "prompt_template_name"]
        column_filters = ["app_id", "phase_number", "ai_prompt_id"]
        create_modal = True
        edit_modal = True

    class PhasePromptAssignmentView(SecuredModelView):
        column_filters = ["app_id", "phase_number", "prompt_id"]
        form_columns = ["app_id", "phase_number", "prompt_id"]

    class PromptTemplatesView(SecuredModelView):
        column_searchable_list = ["name", "description"]
        column_filters = ["organization_id", "created_at"]

    class PromptMessagesView(SecuredModelView):
        column_searchable_list = ["role", "content"]
        column_filters = ["prompt_id", "sequence", "role"]
        form_columns = ["prompt_id", "sequence", "role", "content"]

    class SessionFeedbackView(SecuredModelView):
        column_searchable_list = ["session_id", "feedbacktext", "summary", "rhythm_words"]
        column_filters = ["tenant_id", "user_id", "app_id", "phase_number"]
        form_excluded_columns = ["timestamp"]

    # ---- Register views if tables exist ----
    if AppSettings:
        admin.add_view(AppSettingsView(AppSettings, SessionLocal, category="Core", name="App Settings"))
    if PhaseContent:
        admin.add_view(PhaseContentView(PhaseContent, SessionLocal, category="Core", name="Phase Content"))
    if PhasePromptAssignment:
        admin.add_view(PhasePromptAssignmentView(PhasePromptAssignment, SessionLocal, category="Prompts", name="Phase→Prompt"))
    if PromptTemplates:
        admin.add_view(PromptTemplatesView(PromptTemplates, SessionLocal, category="Prompts", name="Templates"))
    if PromptMessages:
        admin.add_view(PromptMessagesView(PromptMessages, SessionLocal, category="Prompts", name="Template Messages"))
    if SessionFeedback:
        admin.add_view(SessionFeedbackView(SessionFeedback, SessionLocal, category="Sessions", name="Session Feedback"))

    # ---- Scoped session cleanup ----
    @app.teardown_appcontext
    def _remove_scoped_session(exc=None):
        try:
            SessionLocal.remove()
        except Exception:
            pass

    log.info("Flask-Admin models mounted.")
    return {"Base": Base}
