class Ability::BaseAbility
  include CanCan::Ability

  def initialize(user)
    if user.is_admin? || user.is_super_admin? || user.machine_token_user?
      # can :manage, Notification, :ap_mac_id.in => eval("user.router_inventories.pluck(:mac_id)")
      can :manage, LocationNetwork, :id => user.location_networks.pluck(:id)
    elsif user.is_network_admin?
      # permissions = user.unities.pluck(:permission)
      permissions = user.network_tags.keys
      # resources = [{ klass: Notification, relation: "user.router_inventories" }]
      if permissions.include?('limited')
        can [:read, :network_list, :list_networks], LocationNetwork, :id => user.networks_with_limited_access.pluck(:id)
        # network_admin_privileges(user, 'limited', resources)
      end
      if permissions.include?('full')
        can [:read, :update, :destroy, :network_list, :list_networks], LocationNetwork, :id => user.networks_with_full_access.pluck(:id)
        # network_admin_privileges(user, 'full', resources)
      end
    else
      case user.role.try(:name)
      when "monitor_only"
        # can :read, Notification, :id => notifications(user)
      when "network_monitor"
        # can :read, Notification, :id => notifications(user)
      when "customer_care_devices_senior_experts"
        can [:read, :network_list, :list_networks], LocationNetwork, :id => user.location_networks.pluck(:id)
        # can :read, Notification, :id => notifications(user)
      when "customer_care_devices_experts"
        can [:read, :network_list, :list_networks], LocationNetwork, :id => user.location_networks.pluck(:id)
        # can :read, Notification, :id => notifications(user)
      when "customer_care_devices_specialists"  
        can [:read, :network_list, :list_networks], LocationNetwork, :id => user.location_networks.pluck(:id)
        # can [:read, :notifications, :notification_list], Notification, :id => notifications(user)
      when "vendor_techs"
        can [:read, :network_list, :list_networks], LocationNetwork, :id => user.location_networks.pluck(:id)
        # can [:read, :notifications, :notification_list], Notification, :id => notifications(user)
      when "customer_care_general"
        can [:read, :network_list, :list_networks], LocationNetwork, :id => user.location_networks.pluck(:id)
        # can :read, Notification, :id => notifications(user)
      when "nw_onboarding_manager"
        can [:read, :network_list, :list_networks], LocationNetwork, :id => user.location_networks.pluck(:id)
        # can :read, Notification, :id => notifications(user)
      when "nw_onboarding_techs"
        can [:read, :network_list, :list_networks], LocationNetwork, :id => user.location_networks.pluck(:id)
        # can :manage, Notification, :id => notifications(user)
      when "network_r&d"
        can [:read, :network_list, :list_networks], LocationNetwork, :id => user.location_networks.pluck(:id)
        # can :read, Notification, :id => notifications(user)
      when "organization_monitor"
        can [:read, :network_list, :list_networks], LocationNetwork, :id => user.location_networks.pluck(:id)
        # can :read, Notification, :id => notifications(user)
      else
        can [:read, :network_list, :list_networks], LocationNetwork, :id => user.location_networks.pluck(:id)
      end        
    end
  end

  def network_admin_privileges user, access, resources
    ability = access == 'full' ? :manage : :read

    resources.each do |resource|
      if resource[:klass] == Logging || resource[:klass] == VpnConfig
        can ability, resource[:klass], :id => resource[:relation]
      elsif resource[:klass] == Report
        can [ability, :download_pdf], resource[:klass], :id => eval("#{resource[:relation]}_#{access}.pluck(:id)")
      elsif resource[:klass] == Notification
        can ability, Notification, :ap_mac_id.in => eval("#{resource[:relation]}_#{access}.pluck(:mac_id)")
      else
        can ability, resource[:klass], :id => eval("#{resource[:relation]}_#{access}.pluck(:id)")
      end
    end
  end

  def network_admin_common_privileges user, access, resources
    ability = access == 'full' ? :manage : :read

    resources.each do |resource|
      can ability, resource[:klass], id: eval("#{resource[:relation]}_#{access}.pluck(:id)")
    end
  end

  def notifications user 
    Notification.where(:location_network_id.in => user.location_networks.pluck(:id))
  end
end