// Copyright (C) 2019 GerritForge Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at

// http://www.apache.org/licenses/LICENSE-2.0

// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package com.googlesource.gerrit.plugins.analytics.common

import com.google.inject.{ImplementedBy, Inject}
import com.googlesource.gerrit.plugins.analytics.AnalyticsConfig

import scala.util.matching.Regex

@ImplementedBy(classOf[BotLikeExtractorImpl])
trait BotLikeExtractor {
  def isBotLike(files: Set[String]): Boolean
}

class BotLikeExtractorImpl @Inject() (val analyticsConfig: AnalyticsConfig) extends BotLikeExtractor {
  private val botRegexps = new Regex(analyticsConfig.botlikeFilenameRegexps.mkString("|"))
  override def isBotLike(files: Set[String]): Boolean = analyticsConfig.botlikeFilenameRegexps.nonEmpty && files.forall(botRegexps.findFirstIn(_).isDefined)
}
