# frozen_string_literal: true

module UseCase
  module User
    class Ban < UseCase::Base
      REASON_SPAM = "Spam"
      REASON_HARASSMENT = "Harassment"
      REASON_BAN_EVASION = "Ban evasion"

      option :target_user_id, type: Types::Coercible::Integer
      option :expiry, types: Types::Nominal::DateTime.optional
      option :source_user_id, type: Types::Coercible::Integer.optional
      option :reason, type: Types::Coercible::String.optional

      def call
        ban = target_user.ban(expiry, reason, source_user)

        if reason == REASON_SPAM
          target_user.update!(
            profile_picture: nil,
            profile_header:  nil
          )
          target_user.profile.update!(
            display_name: nil,
            description:  "",
            location:     "",
            website:      ""
          )
        end

        {
          status:   201,
          resource: ban,
          extra:    {
            target_user:
          }
        }
      end

      def target_user
        @target_user ||= ::User.find(target_user_id)
      end

      def source_user
        @source_user ||= ::User.find(source_user_id) if source_user_id
      end
    end
  end
end