import { Transform } from 'class-transformer';
import {
  IsBoolean,
  IsNotEmpty,
  IsOptional,
  IsString,
  IsUUID,
  Matches,
  MaxLength,
  ValidateIf,
} from 'class-validator';

const upperTrim = ({ value }: { value: unknown }) => {
  if (value == null) return null;
  if (typeof value !== 'string') return value;
  const trimmed = value.trim();
  return trimmed === '' ? null : trimmed.toUpperCase();
};

export class CreateBankAccountDto {
  @IsUUID()
  @IsNotEmpty()
  bank_id: string;

  @Transform(({ value }) => (typeof value === 'string' ? value.trim() : value))
  @IsString()
  @IsNotEmpty()
  @MaxLength(255)
  account_name: string;

  @Transform(upperTrim)
  @ValidateIf((_, v) => v != null)
  @IsString()
  @Matches(/^[UL][0-9]{5}[A-Z]{2}[0-9]{4}[A-Z]{3}[0-9]{6}$/, {
    message: 'CIN must be a valid 21-character Corporate Identity Number',
  })
  @MaxLength(21)
  cin?: string | null;

  @Transform(upperTrim)
  @ValidateIf((_, v) => v != null)
  @IsString()
  @Matches(/^[A-Z]{5}[0-9]{4}[A-Z]$/, {
    message: 'PAN must be a valid 10-character PAN',
  })
  @MaxLength(10)
  pan?: string | null;

  @Transform(upperTrim)
  @ValidateIf((_, v) => v != null)
  @IsString()
  @Matches(/^[0-9]{2}[A-Z]{5}[0-9]{4}[A-Z][1-9A-Z]Z[0-9A-Z]$/, {
    message: 'GST must be a valid 15-character GSTIN',
  })
  @MaxLength(15)
  gst?: string | null;

  @IsBoolean()
  @IsOptional()
  is_active?: boolean;
}
