import { QueryInterface, DataTypes } from 'sequelize';

export async function up(queryInterface: QueryInterface): Promise<void> {
    // 1. Add total_proposed_taxable_amount to dealer_claim_details
    const dealerClaimDetailsTable = await queryInterface.describeTable('dealer_claim_details');
    if (!dealerClaimDetailsTable.total_proposed_taxable_amount) {
        await queryInterface.addColumn('dealer_claim_details', 'total_proposed_taxable_amount', {
            type: DataTypes.DECIMAL(15, 2),
            allowNull: true,
            comment: 'Total taxable amount from proposal or actuals if higher'
        });
    }

    // 2. Add taxable_closed_expenses to claim_budget_tracking
    const claimBudgetTrackingTable = await queryInterface.describeTable('claim_budget_tracking');
    if (!claimBudgetTrackingTable.taxable_closed_expenses) {
        await queryInterface.addColumn('claim_budget_tracking', 'taxable_closed_expenses', {
            type: DataTypes.DECIMAL(15, 2),
            allowNull: true,
            comment: 'Total taxable amount from the completion expenses'
        });
    }

    // 3. Remove unique constraint from internal_orders to support multiple IOs
    try {
        // Check if the unique index exists before trying to remove it
        const indexes = await queryInterface.showIndex('internal_orders');
        const uniqueIndex = (indexes as any[]).find((idx: any) => idx.name === 'idx_internal_orders_request_id_unique' || (idx.fields && idx.fields[0] && idx.fields[0].attribute === 'request_id' && idx.unique));

        if (uniqueIndex) {
            await queryInterface.removeIndex('internal_orders', uniqueIndex.name);

            // Add a non-unique index for performance
            await queryInterface.addIndex('internal_orders', ['request_id'], {
                name: 'idx_internal_orders_request_id'
            });
        }
    } catch (error) {
        console.error('Error removing unique index from internal_orders:', error);
    }
}

export async function down(queryInterface: QueryInterface): Promise<void> {
    // Rollback logic
    try {
        await queryInterface.removeColumn('dealer_claim_details', 'total_proposed_taxable_amount');
        await queryInterface.removeColumn('claim_budget_tracking', 'taxable_closed_expenses');

        await queryInterface.removeIndex('internal_orders', 'idx_internal_orders_request_id');
        await queryInterface.addIndex('internal_orders', ['request_id'], {
            name: 'idx_internal_orders_request_id_unique',
            unique: true
        });
    } catch (error) {
        console.error('Error in migration rollback:', error);
    }
}
