declare module "brazilian-boletos" {
  // Base Banco class with all methods and properties
  class BancoBase {
    codigo: string;
    nome: string;
    carteira: string;
    carteiras: string[];
    agencia: string;
    conta: string;
    nossoNumero: string;
    moeda: string;
    fator: string;
    valor: string;

    setData(boleto: any, beneficiario: any): void;
    linhaDigitavel(): string;
    codigoDeBarras(campoLivre: string): string;
    codigoDeBarrasCompleto(): string;
    campoLivre(): string;
    dvGeral(mod11: number): string;
  }

  // Bank implementations extending base class
  class Bradesco extends BancoBase {
    codigo: "237";
    nome: "Banco Bradesco S.A.";
  }

  class BancoDoBrasil extends BancoBase {
    codigo: "001";
    nome: "Banco do Brasil";
  }

  // Export Banco as object containing bank instances
  export const Banco: {
    BRADESCO: Bradesco;
    BANCODOBRASIL: BancoDoBrasil;
  };

  export interface BoletoInterface {
    banco: Bradesco | BancoDoBrasil;
    pagador: {
      nome: string;
      endereco: string;
      bairro: string;
      cidade: string;
      uf: string;
      cep: string;
    };
    beneficiario: {
      nome: string;
      cpfCnpj: string;
      endereco: string;
      bairro: string;
      cidade: string;
      uf: string;
      cep: string;
      agencia: string;
      conta: string;
      carteira: string;
    };
    boleto: {
      nossoNumero: string;
      linhaDigitavel?: string;
      numeroDocumento: string;
      dataVencimento: Date;
      dataEmissao: Date;
      dataDocumento?: Date;
      dataProcessamento?: Date;
      valor: number;
      especieDocumento: string;
      instrucoes: Array<string>;
    };
  }

  export class BoletoGenerator {
    constructor(dados: BoletoInterface);

    gerarPDFFile(outpath?: string): Promise<string>;

    gerarPDFBuffer(): Promise<Buffer>;
  }
}
