import { type MigrationInterface, type QueryRunner } from 'typeorm';

/**
 * Pay Supplier debit/credit bank accounts — optional on every payment
 * mode (debit only, credit only, both, or neither). Distinct-IDs CHECK
 * allows either side null.
 *
 * Idempotent: local `synchronize: true` may already have added the
 * columns before this migration ran.
 */
export class SupplierPayoutBankAccounts1786300000000 implements MigrationInterface {
  name = 'SupplierPayoutBankAccounts1786300000000';

  public async up(qr: QueryRunner): Promise<void> {
    await qr.query(`
      ALTER TABLE supplier_payouts
        ADD COLUMN IF NOT EXISTS debit_bank_account_id uuid,
        ADD COLUMN IF NOT EXISTS credit_bank_account_id uuid;
    `);
    await qr.query(`
      DO $$ BEGIN
        IF NOT EXISTS (
          SELECT 1 FROM pg_constraint WHERE conname = 'fk_sp_debit_bank_account'
        ) THEN
          ALTER TABLE supplier_payouts
            ADD CONSTRAINT fk_sp_debit_bank_account
            FOREIGN KEY (debit_bank_account_id) REFERENCES bank_accounts(id);
        END IF;
        IF NOT EXISTS (
          SELECT 1 FROM pg_constraint WHERE conname = 'fk_sp_credit_bank_account'
        ) THEN
          ALTER TABLE supplier_payouts
            ADD CONSTRAINT fk_sp_credit_bank_account
            FOREIGN KEY (credit_bank_account_id) REFERENCES bank_accounts(id);
        END IF;
        IF NOT EXISTS (
          SELECT 1 FROM pg_constraint WHERE conname = 'chk_sp_debit_credit_distinct'
        ) THEN
          ALTER TABLE supplier_payouts
            ADD CONSTRAINT chk_sp_debit_credit_distinct
            CHECK (
              debit_bank_account_id IS NULL
              OR credit_bank_account_id IS NULL
              OR debit_bank_account_id <> credit_bank_account_id
            );
        END IF;
      END $$;
    `);
  }

  public async down(qr: QueryRunner): Promise<void> {
    await qr.query(`
      ALTER TABLE supplier_payouts
        DROP CONSTRAINT IF EXISTS chk_sp_debit_credit_distinct,
        DROP CONSTRAINT IF EXISTS fk_sp_credit_bank_account,
        DROP CONSTRAINT IF EXISTS fk_sp_debit_bank_account,
        DROP COLUMN IF EXISTS credit_bank_account_id,
        DROP COLUMN IF EXISTS debit_bank_account_id;
    `);
  }
}
