data "authentik_flow" "default_authorization_flow" {
  slug = "default-provider-authorization-implicit-consent"
}

data "authentik_certificate_key_pair" "ecdsa" {
  name = "auth.serguzim.me"
}

data "authentik_certificate_key_pair" "rsa" {
  name = "authentik Self-signed Certificate"
}

data "authentik_property_mapping_provider_scope" "default_scopes" {
  managed_list = [
    "goauthentik.io/providers/oauth2/scope-email",
    "goauthentik.io/providers/oauth2/scope-openid",
    "goauthentik.io/providers/oauth2/scope-profile"
  ]
}

resource "authentik_user" "default" {
  username = "serguzim"
  name     = "Tobias Reisinger"
  email    = "tobias@msrg.cc"
}

resource "authentik_property_mapping_provider_scope" "minio" {
  name       = "minio"
  scope_name = "minio"
  expression = <<EOF
if ak_is_group_member(request.user, name="${authentik_group.minio_admins.name}"):
  return {
      "minio_policy": "consoleAdmin",
}
elif ak_is_group_member(request.user, name="${authentik_group.minio_users.name}"):
  return {
      "minio_policy": "readonly"
}
return None
EOF
}

resource "authentik_group" "minio_admins" {
  name         = "Minio admins"
  users        = [authentik_user.default.id]
}

resource "authentik_group" "minio_users" {
  name         = "Minio users"
  users        = []
}


resource "authentik_provider_oauth2" "service_providers" {
  for_each           = local.services_auth
  name               = each.key
  client_type        = "confidential"
  client_id          = each.key
  authorization_flow = data.authentik_flow.default_authorization_flow.id
  redirect_uris      = each.value.auth_redirects
  property_mappings  = flatten([
      data.authentik_property_mapping_provider_scope.default_scopes.ids,
      each.key == "minio" ? [authentik_property_mapping_provider_scope.minio.id] : []
  ])
  signing_key        = (each.value.auth_cert == "rsa" ?
      data.authentik_certificate_key_pair.rsa.id :
      data.authentik_certificate_key_pair.ecdsa.id)
}

resource "authentik_application" "service_applications" {
  for_each          = local.services_auth
  name              = each.key
  slug              = replace(each.value.dns[0].domain, ".", "-")
  protocol_provider = authentik_provider_oauth2.service_providers[each.key].id
}