require "flowdock"

module Backup
  module Notifier
    class FlowDock < Base
      ##
      # The Flowdock API token
      attr_accessor :token

      ##
      # Who the notification should appear from
      attr_accessor :from_name

      # Which email the notification should appear from
      attr_accessor :from_email

      ##
      # source for message
      attr_accessor :source

      ##
      # Subject for message
      attr_accessor :subject

      ##
      # tag message in inbox
      attr_accessor :tags

      ##
      # link for message
      attr_accessor :link

      def initialize(model, &block)
        super
        instance_eval(&block) if block_given?

        @subject        ||= default_subject
        @source         ||= default_source
        @tags           ||= []
      end

      private

      ##
      # Notify the user of the backup operation results.
      #
      # `status` indicates one of the following:
      #
      # `:success`
      # : The backup completed successfully.
      # : Notification will be sent if `on_success` is `true`.
      #
      # `:warning`
      # : The backup completed successfully, but warnings were logged.
      # : Notification will be sent if `on_warning` or `on_success` is `true`.
      #
      # `:failure`
      # : The backup operation failed.
      # : Notification will be sent if `on_warning` or `on_success` is `true`.
      #
      def notify!(status)
        @tags += default_tags(status)
        send_message(message.call(model, status: status_data_for(status)))
      end

      # Flowdock::Client will raise an error if unsuccessful.
      def send_message(msg)
        client = Flowdock::Flow.new(
          api_token: token, source: source,
          from: { name: from_name, address: from_email }
        )

        client.push_to_team_inbox(subject: subject,
                                  content: msg,
                                  tags: tags,
                                  link: link)
      end

      # set related tags
      def default_tags(status)
        case status
        when :success then ["#BackupSuccess"]
        when :warning then ["#BackupWarning"]
        when :failure then ["#BackupFailure"]
        end
      end

      # set default source
      def default_source
        "Backup #{model.label}"
      end

      # set default subject
      def default_subject
        "Backup Notification"
      end
    end
  end
end
