module Abilities
  class Moderation
    include CanCan::Ability

    def initialize(user)
      merge Abilities::Common.new(user)

      can :read, Organization
      can(:verify, Organization) { |o| !o.verified? }
      can(:reject, Organization) { |o| !o.rejected? }

      can :read, Comment

      can :hide, Comment, hidden_at: nil

      can :ignore_flag, Comment, ignored_flag_at: nil, hidden_at: nil
      cannot :ignore_flag, Comment, user_id: user.id

      can :moderate, Comment
      cannot :moderate, Comment, user_id: user.id

      can :hide, Debate, hidden_at: nil
      cannot :hide, Debate, author_id: user.id

      can :ignore_flag, Debate, ignored_flag_at: nil, hidden_at: nil
      cannot :ignore_flag, Debate, author_id: user.id

      can :moderate, Debate
      cannot :moderate, Debate, author_id: user.id

      can :hide, Proposal, hidden_at: nil

      can :ignore_flag, Proposal, ignored_flag_at: nil, hidden_at: nil
      cannot :ignore_flag, Proposal, author_id: user.id

      can :moderate, Proposal

      can :hide, Legislation::Proposal, hidden_at: nil
      cannot :hide, Legislation::Proposal, author_id: user.id

      can :ignore_flag, Legislation::Proposal, ignored_flag_at: nil, hidden_at: nil
      cannot :ignore_flag, Legislation::Proposal, author_id: user.id

      can :moderate, Legislation::Proposal
      cannot :moderate, Legislation::Proposal, author_id: user.id

      can :hide, User
      cannot :hide, User, id: user.id

      can :block, User
      cannot :block, User, id: user.id

      can :hide, ProposalNotification, hidden_at: nil
      cannot :hide, ProposalNotification, author_id: user.id

      can :ignore_flag, ProposalNotification, ignored_at: nil, hidden_at: nil
      cannot :ignore_flag, ProposalNotification, author_id: user.id

      can :moderate, ProposalNotification
      cannot :moderate, ProposalNotification, author_id: user.id

      can :index, ProposalNotification

      can :hide, Budget::Investment, hidden_at: nil
      cannot :hide, Budget::Investment, author_id: user.id

      can :ignore_flag, Budget::Investment, ignored_flag_at: nil, hidden_at: nil
      cannot :ignore_flag, Budget::Investment, author_id: user.id

      can :moderate, Budget::Investment
      cannot :moderate, Budget::Investment, author_id: user.id
    end
  end
end
