# frozen_string_literal: true

require 'use_case/base'

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 = ::UserBan.create!(
          user: target_user,
          expires_at: expiry,
          banned_by: source_user,
          reason: reason
        )

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

        {
          ban: ban
        }
      end

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

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