# frozen_string_literal: true

class PostPolicy < ApplicationPolicy
  administrated_by :community_mod
  include GroupPermissionsHelpers

  def update?
    return false unless user
    return false if user.has_role?(:banned)
    return true if can_administrate?
    return false if record.locked?
    return true if group && has_group_permission?(:content)
    is_owner?
  end

  def create?
    return false unless user
    return false if user.unregistered?
    return false if user.blocked?(record.target_user)
    return false if user.has_role?(:banned)
    return false if user.flags.banned?
    if group
      return false if banned_from_group?
      return false if group.restricted? && !has_group_permission?(:content)
      return false if group.closed? && !member?
    end
    is_owner?
  end

  def destroy?
    return true if group && has_group_permission?(:content)
    is_owner? || can_administrate?
  end

  def editable_attributes(all)
    all - %i[content_formatted embed]
  end

  def group
    record.target_group
  end

  def lock?
    return true if can_administrate? || is_owner?
    return true if group && has_group_permission?(:content)

    false
  end

  def unlock?
    return true if can_administrate?
    return true if group && has_group_permission?(:content)

    false
  end

  def unhold? = can_administrate?

  class Scope < Scope
    def resolve
      return scope if can_administrate?
      visible = scope.visible_for(user).where.not(user_id: blocked_users)
      return visible.sfw unless see_nsfw?
      visible
    end
  end
end
