module SocialStream
  module Ostatus
    module Models
      module Contact
        extend ActiveSupport::Concern

        included do
          # FIXME: hack, this overwrites base definition, see there
          # for the reasons related to after_destroy callbacks
          alias_method_chain :unset_follow_action, :salmon
        end

        module ClassMethods
          # Find contact from OStatus entry
          def from_entry! entry, receiver
            # Sender must be remote
            sender = RemoteSubject.find_or_create_by_webfinger_uri! entry.author.uri

            contact = sender.contact_to!(receiver)

            # FIXME: hack
            contact.user_author = sender

            contact
          end
        end

        # Send Salmon notification
        #
        # FIXME DRY with activity.rb
        def unset_follow_action_with_salmon(relation)
          unset_follow_action_without_salmon(relation)

          return if sender.subject_type == "RemoteSubject" ||
                      receiver.subject_type != "RemoteSubject"

          title = I18n.t "activity.stream.title.unfollow",
                         author: sender_subject.name,
                         activity_object: receiver_subject.name

          entry =
            Proudhon::Entry.new id: "tag:#{ SocialStream::Ostatus.activity_feed_host },2005:contact-destroy-#{ id }",
                                title: title,
                                content: title,
                                verb: 'http://ostatus.org/schema/1.0/unfollow',
                                author: Proudhon::Author.new(name: sender.name,
                                                             uri: sender.webfinger_uri)
          salmon = entry.to_salmon

          if SocialStream::Ostatus.debug_requests
            logger.info entry.to_xml
          end

          # FIXME: Rails 4 queues
          Thread.new do
            salmon.deliver receiver_subject.salmon_url, sender.rsa_key

            ActiveRecord::Base.connection.close
          end
        end
      end
    end
  end
end
