locals {
  # Define a local variable to filter teams with GitHub members
  github_teams = {
    for team_name, team in var.teams : team_name => team if team.github_members != null && length(team.github_members) > 0
  }

  # Create a list of parent teams from the filtered GitHub teams
  github_parent_teams = [
    for team_name, team in local.github_teams : team.parent_team
    if team.parent_team != null && team.parent_team != ""
  ]

  github_team_maintainers = {
    for team_name, team in local.github_teams : team_name => team.github_maintainers
    if team.github_maintainers != null && length(team.github_maintainers) > 0
  }

  # Create a map of parent teams with their slugs
  github_parent_teams_with_slug = {
    for team in toset(local.github_parent_teams) : team => {
      slug = local.github_teams[team].slug
    } if team != null && team != ""
  }

  # Flatten the list of team memberships into a single list of maps
  github_team_memberships = flatten([
    for team_name, team in local.github_teams : [
      for member in team.github_members : {
        team_name = team_name
        team_slug = team.slug
        username  = member
      }
    ]
  ])

  github_team_membership_map = {
    for membership in local.github_team_memberships :
    "${membership.team_slug}/${membership.username}" => membership
  }
}

data "github_team" "parent_team" {
  for_each = local.github_parent_teams_with_slug

  slug = each.value.slug

  summary_only = true
}

resource "github_team" "team" {
  for_each = local.github_teams

  name           = each.key
  description    = coalesce(each.value.github_description != "None" ? each.value.github_description : null, "Managed by Terraform")
  privacy        = "closed"
  parent_team_id = try(data.github_team.parent_team[each.value.parent_team].id, null)
}

resource "github_team_membership" "team_membership" {
  for_each = local.github_team_membership_map

  team_id  = github_team.team[each.value.team_name].id
  role     = can(index(local.github_team_maintainers[each.value.team_name], each.value.username)) ? "maintainer" : "member"
  username = each.value.username

  depends_on = [github_team.team]
}
