"""Dealer Portal Phase 5: register a PRODUCTION_MASTERS RBAC module so
Production/Engineering staff can manage the body type, customer segment,
RTO, special-feature (+options), vehicle model masters, and the model
relationship maps — all the reference data the dealer order wizard reads.

Revision ID: 29f29759316a
Revises: 95ab56f2de59
Create Date: 2026-07-19 09:00:00.000000

"""
import uuid
from typing import Sequence, Union
from datetime import datetime, timezone

from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql


# revision identifiers, used by Alembic.
revision: str = '29f29759316a'
down_revision: Union[str, None] = '95ab56f2de59'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def _uuid():
    return str(uuid.uuid4())


def upgrade() -> None:
    now = datetime.now(timezone.utc)

    module_master = sa.table(
        'module_master',
        sa.column('module_id', postgresql.UUID(as_uuid=True)),
        sa.column('module_code', sa.String),
        sa.column('module_name', sa.String),
        sa.column('description', sa.String),
        sa.column('is_active', sa.Boolean),
        sa.column('created_at', sa.DateTime(timezone=True)),
    )
    op.bulk_insert(module_master, [{
        'module_id': _uuid(), 'module_code': 'PRODUCTION_MASTERS', 'module_name': 'Production Masters',
        'description': 'Vehicle models, body types, customer segments, RTOs, special features, and their relationships',
        'is_active': True, 'created_at': now,
    }])

    role_module_permission = sa.table(
        'role_module_permission',
        sa.column('id', postgresql.UUID(as_uuid=True)),
        sa.column('role_code', sa.String),
        sa.column('module_code', sa.String),
        sa.column('can_view', sa.Boolean),
        sa.column('can_create', sa.Boolean),
        sa.column('can_edit', sa.Boolean),
        sa.column('can_delete', sa.Boolean),
        sa.column('can_approve', sa.Boolean),
        sa.column('updated_at', sa.DateTime(timezone=True)),
    )
    matrix = [
        ('ADMIN', True, True, True, True, True),
        ('PRODUCTION_MGR', True, True, True, True, False),
        ('ENGINEERING_HEAD', True, True, True, True, False),
        ('VIEWER', True, False, False, False, False),
    ]
    op.bulk_insert(role_module_permission, [
        {'id': _uuid(), 'role_code': r, 'module_code': 'PRODUCTION_MASTERS',
         'can_view': v, 'can_create': c, 'can_edit': e, 'can_delete': d, 'can_approve': a,
         'updated_at': now}
        for (r, v, c, e, d, a) in matrix
    ])


def downgrade() -> None:
    op.execute("DELETE FROM role_module_permission WHERE module_code = 'PRODUCTION_MASTERS'")
    op.execute("DELETE FROM module_master WHERE module_code = 'PRODUCTION_MASTERS'")
