# frozen_string_literal: true

Canaid::Permissions.register_for(RepositoryBase) do
  # repository: read/export
  can :read_repository do |user, repository|
    if repository.is_a?(RepositorySnapshot)
      user.teams.include?(repository.team)
    else
      user.teams.include?(repository.team) || repository.shared_with?(user.current_team)
    end
  end
end

Canaid::Permissions.register_for(Repository) do
  # Should be no provisioning snapshots for repository for all the specified permissions
  %i(manage_repository
     create_repository_rows
     manage_repository_rows
     update_repository_rows
     delete_repository_rows
     create_repository_columns)
    .each do |perm|
    can perm do |_, repository|
      repository.repository_snapshots.provisioning.none?
    end
  end

  # repository: update, delete
  can :manage_repository do |user, repository|
    user.is_admin_of_team?(repository.team) unless repository.shared_with?(user.current_team)
  end

  # repository: archive, restore
  can :archive_repository do |user, repository|
    !repository.shared_with?(user.current_team) && user.is_admin_of_team?(repository.team)
  end

  # repository: share
  can :share_repository do |user, repository|
    user.is_admin_of_team?(repository.team) unless repository.shared_with?(user.current_team)
  end

  # repository: make a snapshot with assigned rows
  can :create_repository_snapshot do |user, repository|
    user.is_normal_user_or_admin_of_team?(repository.team)
  end

  # repository: delete a snapshot with assigned rows
  can :delete_repository_snapshot do |user, repository|
    user.is_normal_user_or_admin_of_team?(repository.team)
  end

  # repository: create/import record
  can :create_repository_rows do |user, repository|
    if repository.shared_with?(user.current_team)
      repository.shared_with_write?(user.current_team) && user.is_normal_user_or_admin_of_team?(user.current_team)
    elsif user.teams.include?(repository.team)
      user.is_normal_user_or_admin_of_team?(repository.team)
    end
  end

  # repository: update/delete records
  can :manage_repository_rows do |user, repository|
    can_create_repository_rows?(user, repository)
  end

  can :update_repository_rows do |user, repository|
    can_manage_repository_rows?(user, repository)
  end

  can :delete_repository_rows do |user, repository|
    can_manage_repository_rows?(user, repository)
  end

  # repository: create field
  can :create_repository_columns do |user, repository|
    can_create_repository_rows?(user, repository) unless repository.shared_with?(user.current_team)
  end
end
