module PolicyCheck
  extend ActiveSupport::Concern

  included do
    def self.check_policy_for(*actions)
      options = actions.extract_options!
      before_action(only: actions) do
        check_policy(options[:with], options[:id_param], options[:network_id_param])
      end
    end
  end

  def check_policy(model_class, id_param = :id, network_id_param = nil)
    unless network_id_param
      record = model_class.find_by(id: params[id_param].to_i)
      location_network_id = record.try(:location_network_id)
    else
      location_network_id = params[network_id_param].to_i
    end

    network = if location_network_id.present?
                @current_user.try(:organisation).try(:location_networks).find_by(id: location_network_id)
              else
                @current_network
              end

    if network.template_child?
      child_network = network
      unless child_network.template_adherence
        return true
      end

      parent_network = LocationNetwork.parent_networks(child_network.try(:cloned_network_id))

      raise true unless parent_network.first.enable_policy

      template_policy = parent_network.first.template_policy

      required_key = TemplatePolicy::POLICY_KEY[model_class.name]

      unless template_policy.try(:unlock_controls).try(:key?, required_key)
        raise CanCan::AccessDenied
      end
    elsif network.template?
      raise CanCan::AccessDenied if network.enable_policy
    end
  end
end
