resource "github_branch_protection" "this" {
  count = length(var.branch_protection)

  pattern                = var.branch_protection[count.index]["branch"]
  enforce_admins         = var.branch_protection[count.index]["enforce_admins"]
  require_signed_commits = var.branch_protection[count.index]["require_signed_commits"]
  repository_id          = var.repository

  dynamic "required_status_checks" {
    for_each = var.branch_protection[count.index]["required_status_checks"]

    content {
      strict   = lookup(required_status_checks.value, "strict", false)
      contexts = lookup(required_status_checks.value, "contexts", [])
    }
  }

  dynamic "required_pull_request_reviews" {
    for_each = var.branch_protection[count.index]["required_pull_request_reviews"]

    content {
      dismiss_stale_reviews           = lookup(required_pull_request_reviews.value, "dismiss_stale_reviews", false)
      dismissal_users                 = lookup(required_pull_request_reviews.value, "dismissal_users", [])
      dismissal_teams                 = lookup(required_pull_request_reviews.value, "dismissal_teams", [])
      require_code_owner_reviews      = lookup(required_pull_request_reviews.value, "require_code_owner_reviews", false)
      required_approving_review_count = lookup(required_pull_request_reviews.value, "required_approving_review_count", null)
    }
  }

  dynamic "restrictions" {
    for_each = var.branch_protection[count.index]["restrictions"]

    content {
      users = lookup(restrictions.value, "users", [])
      teams = lookup(restrictions.value, "teams", [])
    }
  }
}
