# frozen_string_literal: true

module Brcobranca
  module Remessa
    module Cnab400
      class Citibank < Brcobranca::Remessa::Cnab400::Base
        # Identificação do portfolio.
        # Necessário consultar o Citibank para informações referentes à conta cobrança e carteira do cliente.
        attr_accessor :portfolio

        validates_presence_of :documento_cedente, :portfolio, message: 'não pode estar em branco.'
        validates_length_of :documento_cedente, minimum: 11, maximum: 14, message: 'deve ter entre 11 e 14 dígitos.'
        validates_length_of :carteira, maximum: 1, message: 'deve ter no máximo 1 dígito.'
        validates_length_of :portfolio, maximum: 20, message: 'deve ter no máximo 20 dígitos.'

        # Nova instancia do Citibank
        def initialize(campos = {})
          campos = { aceite: 'N', carteira: '1' }.merge!(campos)
          super(campos)
        end

        def cod_banco
          '745'
        end

        def nome_banco
          'CITIBANK'.ljust(15, ' ')
        end

        # Informacoes da conta corrente do cedente
        #
        # @return [String]
        #
        def info_conta
          # CAMPO            TAMANHO
          # portfolio        20
          portfolio.rjust(20, ' ')
        end

        # Complemento do header
        # (no caso do Citibank, sao apenas espacos em branco)
        #
        # @return [String]
        #
        def complemento
          # CAMPO                              TAMANHO
          # Densidade de gravação              5
          # Unidade de densidade de gravação   3
          '01600BPI'.rjust(294, ' ')
        end

        # Detalhe do arquivo
        #
        # @param pagamento [PagamentoCnab400]
        #   objeto contendo as informacoes referentes ao boleto (valor, vencimento, cliente)
        # @param sequencial
        #   num. sequencial do registro no arquivo
        #
        # @return [String]
        #
        def monta_detalhe(pagamento, sequencial)
          raise Brcobranca::RemessaInvalida, pagamento if pagamento.invalid?

          detalhe = '1'                                                     # identificacao transacao               9[01]
          detalhe += Brcobranca::Util::Empresa.new(documento_cedente).tipo  # tipo de identificacao da empresa      9[02]
          detalhe << documento_cedente.to_s.rjust(14, '0')                  # cpf/cnpj da empresa                   9[14]
          detalhe << portfolio                                              # portfolio                             X[20]
          detalhe << pagamento.documento_ou_numero.to_s.ljust(25) # identificacao do tit. na empresa      X[25]
          detalhe << pagamento.especie_titulo                               # espécie do título                     9[02] - 00 = DMI – Duplicata Mercantil por Indicação, 02 = DM – Duplicata Mercantil
          detalhe << pagamento.nosso_numero.to_s.rjust(12, '0')             # nosso numero                          9[12]
          detalhe << ''.rjust(6, ' ')                                       # brancos                               X[06]
          detalhe << pagamento.formata_data_segundo_desconto                # data limite para o segundo desconto   9[06]
          detalhe << pagamento.formata_valor_segundo_desconto               # valor do segundo desconto             9[13]
          detalhe << '000'                                                  # carne                                 9[03] - Válido apenas quando o campo 148/149 for igual a 03
          detalhe << '000'                                                  # parcela                               9[03] - Só preencher se o banco for imprimir e enviar e for um carnê
          detalhe << carteira                                               # codigo da carteira                    X[01] - Código 1 = Cobrança Simples, Código 2 = Cobrança Caucionada
          detalhe << pagamento.identificacao_ocorrencia                     # identificacao ocorrencia              9[02]
          detalhe << pagamento.numero.to_s.rjust(10, '0') # numero do documento                   X[10]
          detalhe << pagamento.data_vencimento.strftime('%d%m%y')           # data do vencimento                    9[06]
          detalhe << pagamento.formata_valor                                # valor do documento                    9[13]
          detalhe << cod_banco                                              # codigo banco                          9[03]
          detalhe << ''.rjust(5, '0')                                       # agencia cobradora - deixar zero       9[05]

          # 01 = Banco imprime (apenas boletos simples não personalizados) 03 = Banco imprime de forma personalizada (boletos simples, personalizados e carnês)
          # 07 = Banco não imprime
          # 08 = Impressão via WEB (boleto por e-mail) sem impressão banco 09 = Impressão via WEB (boleto por e-mail) com impressão banco Observações:
          #         - Quando código 03, o cliente deverá entrar em contato com o banco, antes de enviar o arquivo, para definir a personalização do boleto.
          #         - Quando código 07, o campo 065/076, deverá ter o NOSSO NÚMERO atribuído pelo cliente.
          # Se o portfolio do cliente for cobrança flexível:
          # 04 = Título flex com boleto impresso via web (boleto por e-mail), aceita pagamento parcial
          # 06 = Título flex com boleto impresso via web (boleto por e-mail), não aceita pagamento parcial
          # (No caso de Cobrança Flexível, o campo 065/076 – NOSSO NÚMERO, no arquivo remessa, deve ser preenchido pelo cliente,
          # ou será preenchido no banco após a entrada do arquivo no sistema de cobrança, visto que os códigos utilizados serão 04 ou 06 no campo Tipo de Emissão.)
          # (Para a modalidade de Cobrança Flexível, a opção de envio por e- mail deverá ser um parâmetro cadastral.)
          detalhe << '07'                                                   # Tipo de Emissão                       X[02]
          detalhe << aceite                                                 # aceite (A/N)                          X[01]
          detalhe << pagamento.data_emissao.strftime('%d%m%y')              # data de emissao                       9[06]

          # 00 = SEM INSTRUÇÂO: após o vencimento, o título sofrerá a instrução presente no cadastro do cliente. Não havendo instruções no cadastro do cliente, o título será baixado automaticamente após 60 dias e o pagamento, após vencimento, poderá ser restrito ao Citibank
          # 06 = PROTESTAR: quando esta instrução for dada também deverá ser preenchida a posição 159/160
          # 07 = NEGATIVAR: instrução utilizada para envio de título para negativação na Serasa. Quando esta for informada, também deverá ser preenchida as posições 159/160.
          # IMPORTANTE: essa instrução somente poderá ser utilizada após assinatura de contrato específico para o produto.
          # 09 = DEVOLVER: esta é a instrução de BAIXA quando esta instrução for dada também deverá ser preenchida a posição 159/160
          # 10 = SUSTAR PROTESTO: instrução utilizada para títulos que NÃO estejam em cartório
          detalhe << '00' # Instrução para o título               9[02]

          # Quando posição 157/158 (Instrução para título) conter instrução 06 ou 09,
          # este campo deverá conter a quantidade de dias válidos para execução da instrução.
          detalhe << '00'                                                   # Número de dias válidos para instrução 9[02]
          detalhe << pagamento.formata_valor_mora                           # valor mora ao dia                     9[13]
          detalhe << pagamento.formata_data_desconto                        # data limite para desconto             9[06]
          detalhe << pagamento.formata_valor_desconto                       # valor do desconto                     9[13]
          detalhe << pagamento.formata_valor_iof                            # valor do iof                          9[13]
          detalhe << pagamento.formata_valor_abatimento                     # valor do abatimento                   9[13]
          detalhe << pagamento.identificacao_sacado                         # identificacao do pagador              9[02]
          detalhe << pagamento.documento_sacado.to_s.rjust(14, '0')         # documento do pagador                  9[14]
          detalhe << pagamento.nome_sacado.format_size(40)                  # nome do pagador                       X[40]
          detalhe << pagamento.endereco_sacado.format_size(40)              # endereco do pagador                   X[40]
          detalhe << pagamento.bairro_sacado.format_size(12)                # bairro do pagador                     X[12]
          detalhe << pagamento.cep_sacado                                   # cep do pagador                        9[08]
          detalhe << pagamento.cidade_sacado.format_size(15)                # cidade do pagador                     X[15]
          detalhe << pagamento.uf_sacado                                    # uf do pagador                         X[02]

          # Este campo tem 3 finalidades:
          #   a) mensagem da empresa impressa no boleto pelo banco
          #    (para isto na primeira posição deve haver um
          #     asterisco);
          #   b) sem o asterisco, este campo será o nome do Sacador/Avalista, quando preenchido;
          #   c) Se posição 148/149 (Tipo de Emissão) estiver com código 08 ou 09, este campo será o e-mail do sacado.
          detalhe << pagamento.nome_avalista.format_size(40)                # Sacador/Mensagens                     X[40]
          detalhe << ''.rjust(2, ' ')                                       # Brancos                               X[06]
          detalhe << '9'                                                    # moeda                                 9[01] - Código 9 = REAIS Código 5 = Dólar
          detalhe << sequencial.to_s.rjust(6, '0')                          # numero do registro no arquivo         9[06]
          detalhe
        end
      end
    end
  end
end
