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

/**
 * Bank Master + Bank Account Master — tenant-scoped Settings CRUD.
 *
 * banks.name is unique per tenant among live rows (case-insensitive).
 * bank_accounts.bank_id references banks; delete/deactivate of a bank
 * that still has accounts is blocked in BankService (no cascade).
 */
export class CreateBankMasters1786100000000 implements MigrationInterface {
  name = 'CreateBankMasters1786100000000';

  public async up(qr: QueryRunner): Promise<void> {
    await qr.query(`
      CREATE TABLE banks (
        id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
        tenant_id uuid NOT NULL,
        name varchar(255) NOT NULL,
        is_active boolean NOT NULL DEFAULT true,
        is_deleted boolean NOT NULL DEFAULT false,
        created_by uuid,
        updated_by uuid,
        created_at timestamptz NOT NULL DEFAULT now(),
        updated_at timestamptz NOT NULL DEFAULT now()
      );
    `);
    await qr.query(`
      CREATE INDEX idx_banks_tenant_deleted
        ON banks (tenant_id, is_deleted);
    `);
    await qr.query(`
      CREATE UNIQUE INDEX uq_banks_tenant_name_active
        ON banks (tenant_id, LOWER(name))
        WHERE is_deleted = false;
    `);

    await qr.query(`
      CREATE TABLE bank_accounts (
        id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
        tenant_id uuid NOT NULL,
        bank_id uuid NOT NULL REFERENCES banks(id),
        account_name varchar(255) NOT NULL,
        cin varchar(21),
        pan varchar(10),
        gst varchar(15),
        is_active boolean NOT NULL DEFAULT true,
        is_deleted boolean NOT NULL DEFAULT false,
        created_by uuid,
        updated_by uuid,
        created_at timestamptz NOT NULL DEFAULT now(),
        updated_at timestamptz NOT NULL DEFAULT now()
      );
    `);
    await qr.query(`
      CREATE INDEX idx_bank_accounts_tenant_deleted
        ON bank_accounts (tenant_id, is_deleted);
    `);
    await qr.query(`
      CREATE INDEX idx_bank_accounts_tenant_bank
        ON bank_accounts (tenant_id, bank_id)
        WHERE is_deleted = false;
    `);
  }

  public async down(qr: QueryRunner): Promise<void> {
    await qr.query(`DROP INDEX IF EXISTS idx_bank_accounts_tenant_bank;`);
    await qr.query(`DROP INDEX IF EXISTS idx_bank_accounts_tenant_deleted;`);
    await qr.query(`DROP TABLE IF EXISTS bank_accounts;`);
    await qr.query(`DROP INDEX IF EXISTS uq_banks_tenant_name_active;`);
    await qr.query(`DROP INDEX IF EXISTS idx_banks_tenant_deleted;`);
    await qr.query(`DROP TABLE IF EXISTS banks;`);
  }
}
