"""Replace the yard "parts removed" checklist with a proper store handover
sheet (matching the physical "Store - Part Handover from chassis yard check
sheet"), add tick/remark columns to the QA checklist so yard staff don't have
to type "OK" by hand, and seed the transporter master with the requested
codes.

Revision ID: 67b31ad215e2
Revises: f937820abea4
Create Date: 2026-07-17 10: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 import text
from sqlalchemy.dialects import postgresql


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


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


# The store handover checklist, per the physical "Store - Part Handover from
# chassis yard check sheet" — what gets checked off when parts are handed
# from the yard to the store/production, not what was removed at intake.
HANDOVER_PARTS = [
    'Cluster Meter', 'RC Lamp', 'Head Lamp', 'Panic Switch', 'Wiper Motor',
    'Wiper Washer Tank', 'Wiper Nozzle Pipe', 'Wiper Motor Bleed',
    'Seat Belt with Holder', 'R-Pass Sensor Bracket (Black Plastic)',
    'R-Pass Sensor', 'R-Pass Buzzer', 'R-Pass Sensor Harness',
    'R-Pass Sensor Device', 'R-Pass Sensor Device Bracket', 'Horse Logo',
    'Eicher Emblem', 'All Stickers', 'Silver Rod', 'Stepney Rod', 'Jack',
    'Door Lock Kit', 'Switch Panel (DPF, ABS, ECO, ECO+, Headlamp)',
    'Tool Set (Panna Set, Service Book, First Aid Kit, Wheel Panna, Reflector Triangle, Bag & Key Ring)',
]

# Transporter codes requested for the yard's Transporter dropdown. Seeded once;
# further transporters are added from the Sales > Transporters master UI.
TRANSPORTER_CODES = ['APM', 'AR', 'SRVL', 'SLPL', 'FLPL', 'JSE', 'TLPL', 'PM', 'SL']


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

    # ── Store handover: replaces chassis_parts_removed ──
    part_master = op.create_table(
        'store_handover_part_master',
        sa.Column('part_id', postgresql.UUID(as_uuid=True), primary_key=True),
        sa.Column('sr_no', sa.Integer),
        sa.Column('part_name', sa.String(150), nullable=False),
        sa.Column('fuel_applicability', sa.String(20), nullable=False, server_default='ALL'),  # ALL / DIESEL / CNG
        sa.Column('is_active', sa.Boolean, nullable=False, server_default=sa.true()),
        sa.Column('created_at', sa.DateTime(timezone=True)),
    )
    op.bulk_insert(part_master, [
        {'part_id': _uuid(), 'sr_no': i, 'part_name': name, 'fuel_applicability': 'ALL',
         'is_active': True, 'created_at': now}
        for i, name in enumerate(HANDOVER_PARTS, start=1)
    ])

    op.create_table(
        'chassis_store_handover',
        sa.Column('handover_id', postgresql.UUID(as_uuid=True), primary_key=True),
        sa.Column('chassis_id', postgresql.UUID(as_uuid=True), sa.ForeignKey('chassis_master.chassis_id'), nullable=False, unique=True),
        sa.Column('store_keeper_id', postgresql.UUID(as_uuid=True), sa.ForeignKey('login_users.user_id'), nullable=True),
        sa.Column('handover_date', sa.Date),
        sa.Column('is_locked', sa.Boolean, nullable=False, server_default=sa.false()),
        sa.Column('signed_store_person', sa.Boolean, nullable=False, server_default=sa.false()),
        sa.Column('signed_yard_supervisor', sa.Boolean, nullable=False, server_default=sa.false()),
        sa.Column('signed_dalite_supervisor', sa.Boolean, nullable=False, server_default=sa.false()),
        sa.Column('signed_security', sa.Boolean, nullable=False, server_default=sa.false()),
        sa.Column('signature_store_person_name', sa.String(150)),
        sa.Column('signature_yard_supervisor_name', sa.String(150)),
        sa.Column('signature_dalite_supervisor_name', sa.String(150)),
        sa.Column('signature_security_name', sa.String(150)),
        sa.Column('created_at', sa.DateTime(timezone=True)),
    )

    op.create_table(
        'chassis_store_handover_part',
        sa.Column('result_id', postgresql.UUID(as_uuid=True), primary_key=True),
        sa.Column('handover_id', postgresql.UUID(as_uuid=True), sa.ForeignKey('chassis_store_handover.handover_id'), nullable=False),
        sa.Column('part_id', postgresql.UUID(as_uuid=True), sa.ForeignKey('store_handover_part_master.part_id'), nullable=False),
        sa.Column('status', sa.String(10)),  # OK / NOT_OK / NA
        sa.Column('qty', sa.Integer),
        sa.Column('created_at', sa.DateTime(timezone=True)),
        sa.UniqueConstraint('handover_id', 'part_id', name='uq_handover_part'),
    )

    op.drop_table('chassis_parts_removed')

    # ── QA checklist: tick (OK) + free-text remark, instead of typing "OK" every time ──
    for field in ('yard_ok', 'bhagirath_ok', 'fvi_ok', 'fvi_rework_ok', 'fvi_rework_pending_ok'):
        op.add_column('chassis_qa_checklist_result', sa.Column(field, sa.Boolean))

    # ── Seed the requested transporter codes (idempotent by name) ──
    for code in TRANSPORTER_CODES:
        exists = conn.execute(
            text("SELECT 1 FROM transport_master WHERE name = :n"), {"n": code}
        ).scalar()
        if not exists:
            conn.execute(text("""
                INSERT INTO transport_master (transport_id, name, contact_person, contact_number, vehicle_type, active, created_at)
                VALUES (:transport_id, :name, NULL, NULL, NULL, TRUE, :created_at)
            """), {"transport_id": f"TPT-{code}", "name": code, "created_at": now})


def downgrade() -> None:
    conn = op.get_bind()
    conn.execute(text("DELETE FROM transport_master WHERE transport_id = ANY(:ids)"),
                 {"ids": [f"TPT-{code}" for code in TRANSPORTER_CODES]})

    for field in ('yard_ok', 'bhagirath_ok', 'fvi_ok', 'fvi_rework_ok', 'fvi_rework_pending_ok'):
        op.drop_column('chassis_qa_checklist_result', field)

    op.create_table(
        'chassis_parts_removed',
        sa.Column('record_id', postgresql.UUID(as_uuid=True), primary_key=True),
        sa.Column('chassis_id', postgresql.UUID(as_uuid=True), sa.ForeignKey('chassis_master.chassis_id'), nullable=False, unique=True),
        sa.Column('toolkit_tag', sa.Boolean, server_default=sa.false()),
        sa.Column('main_key_tag', sa.Boolean, server_default=sa.false()),
        sa.Column('urea_tank_key_tag', sa.Boolean, server_default=sa.false()),
        sa.Column('urea_plat', sa.Boolean, server_default=sa.false()),
        sa.Column('wiper_motor_kit', sa.Boolean, server_default=sa.false()),
        sa.Column('jack', sa.Boolean, server_default=sa.false()),
        sa.Column('meter_tag', sa.Boolean, server_default=sa.false()),
        sa.Column('tail_light_tag', sa.Boolean, server_default=sa.false()),
        sa.Column('head_light_tag', sa.Boolean, server_default=sa.false()),
        sa.Column('cng_plat', sa.Boolean, server_default=sa.false()),
        sa.Column('sensor_kit_envelope', sa.Boolean, server_default=sa.false()),
        sa.Column('responsible_person', sa.String(150)),
        sa.Column('signature_name', sa.String(150)),
        sa.Column('created_at', sa.DateTime(timezone=True)),
    )

    op.drop_table('chassis_store_handover_part')
    op.drop_table('chassis_store_handover')
    op.drop_table('store_handover_part_master')
