require 'doorkeeper/grape/helpers'

module Receita
  module V1
    class Receitas < Grape::API
      version 'v1', using: :path
      format :json
      prefix :api

      helpers Doorkeeper::Grape::Helpers

      before do
        unless Rails.env.development?
          doorkeeper_authorize! :receitas
        end
      end

      resource :listar_convenios do
        desc 'Retorna a lista de contas bancárias'
        get do

          contas_bancarias = Base::ContaBancaria.where(exibir_na_api: true).map{ |c| {
              "banco": c.agencia.banco.numero_do_banco,
              "agencia": c.agencia.numero_da_agencia,
              "conta_corrente": c.numero_da_conta,
              "convenio": c.convenio_para_boletos
            }
          }

          JSON.parse(JSON.generate(contas_bancarias))
        end
      end

      resource :consultar_protocolo do
        desc 'Retorna a status atual do protocolo'
        params do
          requires :protocolo, type: String
        end
        get do

          lote_de_receita = Contabilidade::LoteDeReceita.where(protocolo: params[:protocolo]).first

          if lote_de_receita.present?
            if lote_de_receita.rejeitado?
              {"status": "success", status_do_protocolo: "#{lote_de_receita.status.try(:upcase)}", motivo: "#{lote_de_receita.motivo.try(:upcase)}"}
            else
              {"status": "success", status_do_protocolo: "#{lote_de_receita.status.try(:upcase)}"}
            end
          else
            {"status": "erro", mensagem: "Lote não encontrado, confira o protocolo informado."}
          end
        end
      end

      resource :enviar_lote do
        desc 'Cria um novo lote'
        params do
          requires :convenio, type: String
          requires :data_de_arrecadacao, type: String
          requires :valor, type: Float
          requires :banco, type: Integer
        end
        post do
          conta_bancaria = Base::ContaBancaria.joins(agencia: :banco).where("numero_do_banco = ? and convenio_para_boletos = ?", params[:banco], params[:convenio]).first
          conteudo = request.body.read

          if conta_bancaria.present?
            lote_de_receita = Contabilidade::LoteDeReceita.new(
              conta_bancaria_id: conta_bancaria.id,
              data_de_arrecadacao: Date.parse(params[:data_de_arrecadacao]),
              convenio: params[:convenio],
              valor: params[:valor],
              conteudo: conteudo
            )
            if lote_de_receita.save
              {"status": "sucesso", "protocolo": "#{lote_de_receita.protocolo}"}
            else
              if conteudo.strip.empty?
                {"status": "erro", mensagem: "Conteúdo não informado."}
              else
                {"status": "erro", mensagem: "#{lote_de_receita.errors[:base].join(",")}"}
              end
            end
          else
            {"status": "erro", mensagem: "Convênio Bancário não localizado."}
          end
        end
      end
    end
  end
end
