"""add_chassis_tracker_module_to_rbac

Revision ID: d4a5b6c7d8e9
Revises: c89f1a2b3c4d
Create Date: 2026-10-20 02:00:00

Registers the CHASSIS_TRACKER module in module_master and seeds default
permissions in role_module_permission for system roles.
"""
from typing import Sequence, Union
import uuid
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql

# revision identifiers, used by Alembic.
revision: str = 'd4a5b6c7d8e9'
down_revision: Union[str, None] = 'c89f1a2b3c4d'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
    conn = op.get_bind()

    # 1. Register CHASSIS_TRACKER module
    conn.execute(sa.text("""
        INSERT INTO module_master (module_id, module_code, module_name, description, is_active, created_at)
        VALUES (
            :module_id,
            'CHASSIS_TRACKER',
            'Chassis Tracker',
            'Global Chassis Lifecycle Tracker with visual timeline milestones, build specs & customer updates',
            TRUE,
            NOW()
        )
        ON CONFLICT (module_code) DO NOTHING;
    """), {
        'module_id': str(uuid.uuid4())
    })

    # 2. Seed default permissions for key roles
    # (role_code, can_view, can_create, can_edit, can_delete, can_approve)
    default_permissions = [
        ('ADMIN', True, True, True, True, True),
        ('SALES_MGR', True, True, True, False, True),
        ('SALES_EXEC', True, True, True, False, False),
        ('PRODUCTION_MGR', True, False, True, False, False),
        ('PRODUCTION_SUPERVISOR', True, False, False, False, False),
        ('QA_SUPERVISOR', True, False, False, False, False),
        ('QA_INSPECTOR', True, False, False, False, False),
        ('YARD_SUPERVISOR', True, False, False, False, False),
        ('CLIENT_ADMIN', True, False, False, False, False),
        ('ENGINEERING_HEAD', True, False, False, False, False),
        ('PROCUREMENT_MGR', True, False, False, False, False),
        ('VIEWER', True, False, False, False, False),
    ]

    for role_code, v, c, e, d, a in default_permissions:
        conn.execute(sa.text("""
            INSERT INTO role_module_permission (id, role_code, module_code, can_view, can_create, can_edit, can_delete, can_approve, updated_at)
            VALUES (
                :id,
                :role_code,
                'CHASSIS_TRACKER',
                :can_view,
                :can_create,
                :can_edit,
                :can_delete,
                :can_approve,
                NOW()
            )
            ON CONFLICT (role_code, module_code) DO NOTHING;
        """), {
            'id': str(uuid.uuid4()),
            'role_code': role_code,
            'can_view': v,
            'can_create': c,
            'can_edit': e,
            'can_delete': d,
            'can_approve': a,
        })


def downgrade() -> None:
    conn = op.get_bind()
    conn.execute(sa.text("DELETE FROM role_module_permission WHERE module_code = 'CHASSIS_TRACKER';"))
    conn.execute(sa.text("DELETE FROM module_master WHERE module_code = 'CHASSIS_TRACKER';"))
