"""add_extended_chassis_fields

Revision ID: 9bce9abbb1c8
Revises: b8e9f0a1c2d3
Create Date: 2026-07-30 12:50:17.410536

"""
from typing import Sequence, Union

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

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


def upgrade() -> None:
    # ### commands auto generated by Alembic - please adjust! ###
    op.add_column('build_order', sa.Column('build_spec_id', sa.UUID(), nullable=True))
    op.add_column('build_order', sa.Column('procurement_status', sa.String(length=30), nullable=True))
    op.add_column('build_order', sa.Column('procurement_reviewed_by', sa.UUID(), nullable=True))
    op.add_column('build_order', sa.Column('procurement_reviewed_at', sa.DateTime(timezone=True), nullable=True))
    op.add_column('build_order', sa.Column('procurement_notes', sa.Text(), nullable=True))
    op.add_column('build_order', sa.Column('production_status', sa.String(length=30), nullable=True))
    op.add_column('build_order', sa.Column('production_reviewed_by', sa.UUID(), nullable=True))
    op.add_column('build_order', sa.Column('production_reviewed_at', sa.DateTime(timezone=True), nullable=True))
    op.add_column('build_order', sa.Column('production_notes', sa.Text(), nullable=True))
    op.add_column('build_order', sa.Column('target_start_date', sa.Date(), nullable=True))
    op.add_column('build_order', sa.Column('estimated_completion_date', sa.Date(), nullable=True))
    op.add_column('build_order', sa.Column('sales_released_by', sa.UUID(), nullable=True))
    op.add_column('build_order', sa.Column('sales_released_at', sa.DateTime(timezone=True), nullable=True))
    op.add_column('build_order', sa.Column('sales_release_notes', sa.Text(), nullable=True))
    op.add_column('build_order', sa.Column('total_bom_lines', sa.Integer(), nullable=True))
    op.add_column('build_order', sa.Column('total_shortage_lines', sa.Integer(), nullable=True))
    op.add_column('build_order', sa.Column('total_rm_value', sa.Float(), nullable=True))
    op.add_column('build_order', sa.Column('bom_exploded_at', sa.DateTime(timezone=True), nullable=True))
    op.add_column('build_order', sa.Column('priority', sa.String(length=10), nullable=True))
    op.create_foreign_key(None, 'build_order', 'login_users', ['production_reviewed_by'], ['user_id'])
    op.create_foreign_key(None, 'build_order', 'login_users', ['sales_released_by'], ['user_id'])
    op.create_foreign_key(None, 'build_order', 'login_users', ['procurement_reviewed_by'], ['user_id'])
    op.add_column('chassis_master', sa.Column('dealer_order_vehicle_id', sa.UUID(), nullable=True))
    op.add_column('chassis_master', sa.Column('driver_name', sa.String(length=150), nullable=True))
    op.add_column('chassis_master', sa.Column('driver_license', sa.String(length=50), nullable=True))
    op.add_column('chassis_master', sa.Column('driver_phone', sa.String(length=20), nullable=True))
    op.add_column('chassis_master', sa.Column('inbound_vehicle_no', sa.String(length=20), nullable=True))
    op.add_column('chassis_master', sa.Column('chassis_condition', sa.String(length=20), nullable=True))
    op.add_column('chassis_master', sa.Column('chassis_odometer', sa.Integer(), nullable=True))
    op.add_column('chassis_master', sa.Column('inspection_done', sa.Boolean(), nullable=True))
    op.add_column('chassis_master', sa.Column('inspection_by', sa.UUID(), nullable=True))
    op.add_column('chassis_master', sa.Column('inspection_at', sa.DateTime(timezone=True), nullable=True))
    op.add_column('chassis_master', sa.Column('yard_slot_id', sa.UUID(), nullable=True))
    op.add_column('chassis_master', sa.Column('enquiry_id', sa.UUID(), nullable=True))
    op.add_column('chassis_master', sa.Column('oem', sa.String(length=50), nullable=True))
    op.add_column('chassis_master', sa.Column('year_of_manufacture', sa.SmallInteger(), nullable=True))
    op.add_column('chassis_master', sa.Column('transport_company', sa.String(length=100), nullable=True))
    op.add_column('chassis_master', sa.Column('build_spec_id', sa.UUID(), nullable=True))
    op.create_foreign_key(None, 'chassis_master', 'sales_enquiry', ['enquiry_id'], ['enquiry_id'])
    op.create_foreign_key(None, 'chassis_master', 'login_users', ['inspection_by'], ['user_id'])
    op.create_foreign_key(None, 'chassis_master', 'dealer_order_vehicle', ['dealer_order_vehicle_id'], ['order_vehicle_id'])
    op.create_foreign_key(None, 'chassis_master', 'yard_slot_master', ['yard_slot_id'], ['slot_id'])
    op.alter_column('maintenance_equipment_purchase', 'created_at',
               existing_type=postgresql.TIMESTAMP(timezone=True),
               nullable=False)
    op.alter_column('maintenance_equipment_rental', 'created_at',
               existing_type=postgresql.TIMESTAMP(timezone=True),
               nullable=False)
    op.alter_column('maintenance_machine_consumption_cost', 'created_at',
               existing_type=postgresql.TIMESTAMP(timezone=True),
               nullable=False)
    op.alter_column('maintenance_monthly_stock', 'created_at',
               existing_type=postgresql.TIMESTAMP(timezone=True),
               nullable=False)
    op.add_column('sales_enquiry', sa.Column('total_chassis_ordered', sa.Integer(), nullable=True))
    op.add_column('sales_enquiry', sa.Column('chassis_arrived_count', sa.Integer(), nullable=True))
    op.add_column('sales_enquiry', sa.Column('expected_arrival_start', sa.Date(), nullable=True))
    op.add_column('sales_enquiry', sa.Column('expected_arrival_end', sa.Date(), nullable=True))
    # ### end Alembic commands ###


def downgrade() -> None:
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_column('sales_enquiry', 'expected_arrival_end')
    op.drop_column('sales_enquiry', 'expected_arrival_start')
    op.drop_column('sales_enquiry', 'chassis_arrived_count')
    op.drop_column('sales_enquiry', 'total_chassis_ordered')
    op.alter_column('maintenance_monthly_stock', 'created_at',
               existing_type=postgresql.TIMESTAMP(timezone=True),
               nullable=True)
    op.alter_column('maintenance_machine_consumption_cost', 'created_at',
               existing_type=postgresql.TIMESTAMP(timezone=True),
               nullable=True)
    op.alter_column('maintenance_equipment_rental', 'created_at',
               existing_type=postgresql.TIMESTAMP(timezone=True),
               nullable=True)
    op.alter_column('maintenance_equipment_purchase', 'created_at',
               existing_type=postgresql.TIMESTAMP(timezone=True),
               nullable=True)
    op.drop_constraint(None, 'chassis_master', type_='foreignkey')
    op.drop_constraint(None, 'chassis_master', type_='foreignkey')
    op.drop_constraint(None, 'chassis_master', type_='foreignkey')
    op.drop_constraint(None, 'chassis_master', type_='foreignkey')
    op.drop_column('chassis_master', 'build_spec_id')
    op.drop_column('chassis_master', 'transport_company')
    op.drop_column('chassis_master', 'year_of_manufacture')
    op.drop_column('chassis_master', 'oem')
    op.drop_column('chassis_master', 'enquiry_id')
    op.drop_column('chassis_master', 'yard_slot_id')
    op.drop_column('chassis_master', 'inspection_at')
    op.drop_column('chassis_master', 'inspection_by')
    op.drop_column('chassis_master', 'inspection_done')
    op.drop_column('chassis_master', 'chassis_odometer')
    op.drop_column('chassis_master', 'chassis_condition')
    op.drop_column('chassis_master', 'inbound_vehicle_no')
    op.drop_column('chassis_master', 'driver_phone')
    op.drop_column('chassis_master', 'driver_license')
    op.drop_column('chassis_master', 'driver_name')
    op.drop_column('chassis_master', 'dealer_order_vehicle_id')
    op.drop_constraint(None, 'build_order', type_='foreignkey')
    op.drop_constraint(None, 'build_order', type_='foreignkey')
    op.drop_constraint(None, 'build_order', type_='foreignkey')
    op.drop_column('build_order', 'priority')
    op.drop_column('build_order', 'bom_exploded_at')
    op.drop_column('build_order', 'total_rm_value')
    op.drop_column('build_order', 'total_shortage_lines')
    op.drop_column('build_order', 'total_bom_lines')
    op.drop_column('build_order', 'sales_release_notes')
    op.drop_column('build_order', 'sales_released_at')
    op.drop_column('build_order', 'sales_released_by')
    op.drop_column('build_order', 'estimated_completion_date')
    op.drop_column('build_order', 'target_start_date')
    op.drop_column('build_order', 'production_notes')
    op.drop_column('build_order', 'production_reviewed_at')
    op.drop_column('build_order', 'production_reviewed_by')
    op.drop_column('build_order', 'production_status')
    op.drop_column('build_order', 'procurement_notes')
    op.drop_column('build_order', 'procurement_reviewed_at')
    op.drop_column('build_order', 'procurement_reviewed_by')
    op.drop_column('build_order', 'procurement_status')
    op.drop_column('build_order', 'build_spec_id')
    # ### end Alembic commands ###
