/// <reference types="angular" />
/// <reference types="angular-resource" />
declare namespace hurbis.pagamento {
    interface IPagamentoConfigService {
        getConfiguracao(): IConfiguracao;
    }
    interface IConfiguracaoPagSeguro {
        cookieNomeSessionId: string;
        /**
        * Rotina para recuperar sessão gerada a partir do servidor. Para facilitar, utilize o componente Hurbis.Pagamento (NuGet) em sua API.
        */
        recuperarSessaoServidor?: angular.Injectable<{
            (...args: any[]): ng.IPromise<pagseguro.ISessao>;
        }>;
        producao: boolean;
    }
    interface IConfiguracao {
        pagSeguro: IConfiguracaoPagSeguro;
    }
}
interface Window {
    PagSeguroDirectPayment: PagSeguroDirectPayment;
}
declare var PagSeguroDirectPayment: PagSeguroDirectPayment;
interface PagSeguroDirectPayment {
    setSessionId(valor: string): void;
    getSenderHash(): string;
    getPaymentMethods(parametro: hurbis.pagamento.pagseguro.IFormasPagamentoParametro): void;
    getBrand(parametro: hurbis.pagamento.pagseguro.IBandeiraCartaoParametro): void;
    createCardToken(parametro: hurbis.pagamento.pagseguro.ICartaoTokenParametro): void;
    getInstallments(parametro: hurbis.pagamento.pagseguro.ICartaoParcelamentoParametro): void;
}
declare namespace hurbis.pagamento.pagseguro {
    const CAMINHO_BASE_RECURSO_PRODUCAO: string;
    const CAMINHO_BASE_RECURSO_DESENVOLVIMENTO: string;
    interface IParametro<T> {
        success: {
            (resultado: T): void;
        };
        error: {
            (erro): void;
        };
        complete?: {
            (resultado): void;
        };
    }
    interface IFormaPagamentoImagem {
        size: string;
        path: string;
    }
    interface IFormaPagamentoImagens {
        SMALL: IFormaPagamentoImagem;
        MEDIUM: IFormaPagamentoImagem;
    }
    interface IFormaPagamentoDetalhe {
        name: string;
        displayName: string;
        status: string;
        code: number;
        images: IFormaPagamentoImagens;
    }
    interface IFormaPagamento<T> {
        name: string;
        options: T;
        code: number;
    }
    interface IFormaPagamentoOpcaoBoleto {
        BOLETO: IFormaPagamentoDetalhe;
    }
    interface IFormaPagamentoOpcaoDeposito {
        BANCO_BRASIL: IFormaPagamentoDetalhe;
        HSBC: IFormaPagamentoDetalhe;
    }
    interface IFormaPagamentoOpcaoDebito {
        BANCO_BRASIL: IFormaPagamentoDetalhe;
        BANRISUL: IFormaPagamentoDetalhe;
        BRADESCO: IFormaPagamentoDetalhe;
        ITAU: IFormaPagamentoDetalhe;
    }
    interface IFormaPagamentoOpcaoCredito {
        AMEX?: IFormaPagamentoDetalhe;
        AURA?: IFormaPagamentoDetalhe;
        BRASILCARD?: IFormaPagamentoDetalhe;
        DINERS?: IFormaPagamentoDetalhe;
        ELO?: IFormaPagamentoDetalhe;
        HIPERCARD?: IFormaPagamentoDetalhe;
        MASTERCARD?: IFormaPagamentoDetalhe;
        PERSONALCARD?: IFormaPagamentoDetalhe;
        PLENOCARD?: IFormaPagamentoDetalhe;
        SOROCRED?: IFormaPagamentoDetalhe;
        VISA?: IFormaPagamentoDetalhe;
        VALECARD?: IFormaPagamentoDetalhe;
    }
    interface IFormasPagamento {
        BOLETO?: IFormaPagamento<IFormaPagamentoOpcaoBoleto>;
        ONLINE_DEBIT?: IFormaPagamento<IFormaPagamentoOpcaoDebito>;
        CREDIT_CARD?: IFormaPagamento<IFormaPagamentoOpcaoCredito>;
        DEPOSIT?: IFormaPagamento<IFormaPagamentoOpcaoCredito>;
    }
    interface IFormasPagamentoParametro extends IParametro<IFormasPagamentoResultado> {
        amount: number;
    }
    interface IFormasPagamentoResultado {
        error: boolean;
        paymentMethods: IFormasPagamento;
    }
    interface IBandeiraCartao {
        name: string;
        bin: number;
        cvvSize: number;
        expirable: boolean;
        validationAlgorithm: string;
    }
    interface IBandeiraCartaoParametro extends IParametro<IBandeiraCartaoResultado> {
        cardBin: number;
    }
    interface IBandeiraCartaoResultado {
        brand: IBandeiraCartao;
    }
    interface ICartaoToken {
        token: string;
    }
    interface ICartaoTokenBase {
        cardNumber: number;
        brand: string;
        cvv?: number;
        expirationMonth?: number;
        expirationYear?: number;
    }
    interface ICartaoTokenParametro extends IParametro<ICartaoTokenResultado>, ICartaoTokenBase {
    }
    interface ICartaoTokenResultado {
        card: ICartaoToken;
    }
    interface ICartaoParcelamentoDetalhe {
        quantity: number;
        totalAmount: number;
        installmentAmount: number;
        interestFree: boolean;
    }
    interface ICartaoParcelamento {
        amex?: ICartaoParcelamentoDetalhe[];
        aura?: ICartaoParcelamentoDetalhe[];
        brasilcard?: ICartaoParcelamentoDetalhe[];
        diners?: ICartaoParcelamentoDetalhe[];
        elo?: ICartaoParcelamentoDetalhe[];
        hipercard?: ICartaoParcelamentoDetalhe[];
        mastercard?: ICartaoParcelamentoDetalhe[];
        personalcard?: ICartaoParcelamentoDetalhe[];
        plenocard?: ICartaoParcelamentoDetalhe[];
        sorocred?: ICartaoParcelamentoDetalhe[];
        visa?: ICartaoParcelamentoDetalhe[];
        valecard?: ICartaoParcelamentoDetalhe[];
    }
    interface ICartaoParcelamentoParametroBase {
        amount: number;
        brand?: string;
        maxInstallmentNoInterest?: number;
    }
    interface ICartaoParcelamentoResultado {
        error: boolean;
        installments: ICartaoParcelamento;
    }
    interface ICartaoParcelamentoParametro extends IParametro<ICartaoParcelamentoResultado>, ICartaoParcelamentoParametroBase {
    }
}
declare namespace hurbis.pagamento.pagseguro {
    interface ISessao {
        id: string;
        dataHora: Date;
    }
    interface ITelefone {
        codigoArea: string;
        numero: string;
    }
    enum TipoDocumento {
        CPF = 1,
        CNPJ = 2,
    }
    interface IDocumento {
        tipo: TipoDocumento;
        valor: string;
    }
    interface IComprador {
        hash: string;
        ip?: string;
        dataNascimento: Date;
        telefone: ITelefone;
        email: string;
        documentos: IDocumento[];
        nome: string;
    }
    interface IItem {
        id: string;
        descricao: string;
        valorUnitario: number;
        quantidade: number;
    }
    interface IEndereco {
        logradouro: string;
        numero: number;
        complemento?: string;
        bairro: string;
        cidade: string;
        estado: string;
        pais?: string;
        cep: string;
    }
    enum TipoFrete {
        PAC = 1,
        Sedex = 2,
        Nenhum = 3,
    }
    interface IFrete {
        endereco?: IEndereco;
        tipo?: TipoFrete;
        valor?: number;
        enderecoObrigatorio: boolean;
    }
    interface IParcelamento {
        quantidade: number;
        quantidadeParcelasSemJuros: number;
        valor: number;
    }
    interface IResponsavel {
        nome: string;
        documentos: IDocumento[];
        dataNascimento: Date;
        telefone: ITelefone;
    }
    interface ICartaoCredito {
        token: string;
        parcelamento: IParcelamento;
        responsavel: IResponsavel;
        enderecoCobranca: IEndereco;
    }
    interface IBanco {
        nome: string;
    }
    interface IDynamicPaymentMethodMessage {
        creditCard: string;
        boleto: string;
    }
    enum TipoMeioPagamento {
        CartaoCredito = 1,
        Boleto = 2,
        Debito = 3,
    }
    interface IPagamento {
        /**
        * URL para envio de notificações. Formato: Uma URL válida, com limite de 255 caracteres.
        **/
        notificationURL?: string;
        comprador: IComprador;
        itens: IItem[];
        /**
        * Código de referência da transação.
        * Informa o código que foi usado para fazer referência ao pagamento.
        * Este código foi fornecido no momento do pagamento e é útil para vincular as
        * transações do PagSeguro às vendas registradas no seu sistema.
        * Formato: Livre, com o limite de 200 caracteres.
        **/
        codigoReferencia?: string;
        frete: IFrete;
        /**
        * Valores extras a serem cobrados.
        * Formato: Decimal, com duas casas decimais separadas por ponto (p.e., 1234.56),
        * maior que 0.00 e menor ou igual a 9999999.00.
        **/
        valorExtra?: number;
        /**
        * Meio de pagamento.
        **/
        meioPagamento: TipoMeioPagamento;
        cartaoCredito?: ICartaoCredito;
        /**
        * Dados para pagamento com Débito Online.
        **/
        banco?: IBanco;
        dynamicPaymentMethodMessage?: IDynamicPaymentMethodMessage;
        /**
        * O campo promoCode pode ser utilizado para promoções e parcerias com o PagSeguro.
        **/
        codigoPromocional?: string;
    }
    enum TipoFormaPagamento {
        CartaoCredito = 1,
        Boleto = 2,
        Debito = 3,
        Saldo = 4,
        DepositoConta = 7,
    }
    enum CodigoFormaPagamento {
        CartaoCreditoVisa = 101,
        CartaoCreditoMasterCard = 102,
        CartaoCreditoAmericanExpress = 103,
        CartaoCreditoDiners = 104,
        CartaoCreditoHipercard = 105,
        CartaoCreditoAura = 106,
        CartaoCreditoElo = 107,
        CartaoCreditoPersonalCard = 109,
        CartaoCreditoBrasilCard = 112,
        CartaoCreditoFORTBRASIL = 113,
        CartaoCreditoVALECARD = 115,
        CartaoCreditoCabal = 116,
        CartaoCreditoMais = 117,
        CartaoCreditoGRANDCARD = 119,
        CartaoCreditoSorocred = 120,
        CartaoCreditoUpPolicard = 122,
        CartaoCreditoBaneseCard = 123,
        BoletoBradesco = 201,
        BoletoSantander = 202,
        DebitoBradesco = 301,
        DebitoItau = 302,
        DebitoBancoBrasil = 304,
        DebitoBanrisul = 306,
        SaldoPagSeguro = 401,
        DepositoEmContaBancoBrasil = 701,
        DepositoEmContaHSBC = 702,
    }
    interface IFormaPagamentoTransacao {
        tipo: TipoFormaPagamento;
        codigo: CodigoFormaPagamento;
    }
    enum TipoTransacao {
        CHECKOUT = 1,
        TRANSFER = 2,
        FUNDS_ADDITION = 3,
        WITHDRAW = 4,
        CHARGING = 5,
        DONATATION = 6,
        BONUS = 7,
        BONUS_REPASS = 8,
        OPERATIONAL = 9,
        POLITICAL_DONATATION = 10,
        PAGAMENTO_PRE_APROVADO = 11,
        BONUS_CAMPAIGN = 12,
        SECONDARY = 13,
        VALIDATOR = 14,
    }
    enum TipoStatus {
        Nenhum = 0,
        AguardandoPagamento = 1,
        EmAnalise = 2,
        Paga = 3,
        Disponivel = 4,
        EmDisputa = 5,
        Devolvida = 6,
        Cancelada = 7,
    }
    interface ITransacao {
        data: Date;
        codigoReferencia: string;
        formaPagamento: IFormaPagamentoTransacao;
        comprador: IComprador;
        valorBruto: number;
        itens: IItem[];
        frete: IFrete;
        dataSituacao: Date;
        origemCancelamento: string;
        valorDesconto: number;
        valorLiquido: number;
        valorExtra: number;
        dataEncerramento: Date;
        quantidadeParcela: number;
        valorTaxa: number;
        linkPagamento?: string;
        tipo: TipoTransacao;
        status: TipoStatus;
        quantidadeItens: number;
        codigo: string;
    }
}
declare namespace hurbis.pagamento.pagseguro {
    class Util {
        static recuperarDetalheCartaoCredito(opcoes: IFormaPagamentoOpcaoCredito, bandeira: string): IFormaPagamentoDetalhe;
        static recuperarParcelaCartaoCredito(opcoes: ICartaoParcelamento, bandeira: string): ICartaoParcelamentoDetalhe[];
    }
}
declare namespace hurbis.pagamento {
    class Script {
        static PAGSEGURO_PRODUCAO: string;
        static PAGSEGURO_DESENVOLVIMENTO: string;
        static itens: hurbis.comum.IScriptDefinicao[];
    }
}
declare namespace hurbis.pagamento {
    class Modulo {
        static DEFINICAO: comum.IModuloDefinicao;
        static inicializar(): void;
    }
}
declare namespace hurbis.pagamento {
    class ConfiguracaoProvider implements angular.IServiceProvider {
        constructor();
        private _configuracao;
        configurar(configuracao: IConfiguracao): void;
        getConfiguracao: () => IConfiguracao;
        $get: (() => IPagamentoConfigService)[];
        static inicializar(): void;
    }
}
declare namespace hurbis.pagamento {
    class PagamentoPagSeguroService {
        private $resource;
        private $q;
        private $injector;
        private configuracao;
        constructor($resource: angular.resource.IResourceService, $q: angular.IQService, $injector: angular.auto.IInjectorService, $hbsPagamentoConfig: IPagamentoConfigService);
        private Sessao;
        private atualizarSessaoPagSeguro();
        private converterMinutoParaMilisegundo(tempo);
        private sessaoValida();
        private executarMetodo(metodo);
        /**
         * Iniciar sessão junto ao servidor do PagSeguro. Necessário configurar rotina pagSeguro.recuperarSessaoServidor.
         * Método é chamado automaticamente ao acionar alguma rotina que dependa da sessão.
         */
        iniciarSessaoAsync(): ng.IPromise<void>;
        /**
         * Recupera identificador único do comprador/cliente para realizar operações.
         */
        getIdentificadorComprador(): string;
        /**
         * Recupera os meios de pagamento disponíveis para o valor informado.
         * @param valor Valor do produto/serviço.
         */
        getMeiosPagamento(valor: number): ng.IPromise<pagseguro.IFormasPagamentoResultado>;
        /**
         * Retorna a bandeira do cartão.
         * @param binCartao Seis primeiros números do cartão.
         */
        getBandeira(binCartao: number): ng.IPromise<pagseguro.IBandeiraCartaoResultado>;
        /**
        * Recupera token gerado pelo PagSeguro para o cartão de crédito informado.
        * @param cartao Dados do cartão.
        */
        getCartaoToken(cartao: pagseguro.ICartaoTokenBase): ng.IPromise<pagseguro.ICartaoTokenResultado>;
        /**
       * Retorna a lista de parcelas com seus respectivos detalhes.
       * @param informacaoParcelamento Informações do parcelamento.
       */
        getParcelas(informacaoParcelamento: pagseguro.ICartaoParcelamentoParametroBase): ng.IPromise<pagseguro.ICartaoParcelamentoResultado>;
        static inicializar(): void;
    }
}
