# CheckOps : analyse chaque jour les images du registre de conteneurs Scaleway avec Trivy et
# envoie les résultats à CheckOps (COPS-73). Tourne dans votre projet Scaleway, en tâche
# Serverless Jobs planifiée. Droits : lecture seule du registre, rien d'autre.
#
#   module "checkops" {
#     source         = "./checkops"   # dossier contenant ce fichier
#     project_id     = "11111111-…"
#     checkops_token = var.checkops_token
#   }
#
# Premier passage (reprise de l'existant) : lancez une fois la tâche avec l'argument --all
# depuis la console (Serverless Jobs, « Run job » avec des arguments personnalisés).

terraform {
  required_providers {
    scaleway = { source = "scaleway/scaleway", version = ">= 2.50" }
  }
}

variable "project_id" {
  description = "Projet Scaleway qui contient les espaces de noms du registre."
  type        = string
}

variable "checkops_token" {
  description = "Jeton d'API CheckOps (ck_live_...), créé dans le portail, page Jetons d'API."
  type        = string
  sensitive   = true
}

variable "checkops_url" {
  type    = string
  default = "https://api.checkops.eu"
}

variable "region" {
  description = "Région du registre et de la tâche (fr-par, nl-ams, pl-waw)."
  type        = string
  default     = "fr-par"
}

variable "namespaces" {
  description = "Espaces de noms à suivre, séparés par des virgules (vide = tous)."
  type        = string
  default     = ""
}

variable "product_prefix" {
  description = "Préfixe des produits CheckOps (l'image api devient <préfixe>api)."
  type        = string
  default     = ""
}

variable "schedule" {
  description = "Planification cron (par défaut chaque jour à 3 h, heure de Paris)."
  type        = string
  default     = "0 3 * * *"
}

variable "image" {
  description = "Image de la CLI CheckOps avec Trivy (tag versionné ; épingler par empreinte de préférence)."
  type        = string
  # Version figée plutôt que le tag mobile `cli:trivy`. Pour figer le contenu exact :
  # registry.gitlab.com/clearcloud.fr/check-ops/cli:0.42.0-trivy@sha256:<empreinte>
  default = "registry.gitlab.com/clearcloud.fr/check-ops/cli:0.42.0-trivy"
}

variable "name" {
  type    = string
  default = "checkops-registry"
}

# Application IAM dédiée, en lecture seule sur le registre du projet.
resource "scaleway_iam_application" "this" {
  name        = var.name
  description = "CheckOps : lecture du registre de conteneurs pour l'analyse des images"
}

resource "scaleway_iam_policy" "this" {
  name           = var.name
  application_id = scaleway_iam_application.this.id
  rule {
    project_ids          = [var.project_id]
    permission_set_names = ["ContainerRegistryReadOnly"]
  }
}

resource "scaleway_iam_api_key" "this" {
  application_id     = scaleway_iam_application.this.id
  default_project_id = var.project_id
  description        = "CheckOps : lecture du registre"
}

# Clés gardées dans Secret Manager, jamais en clair dans la définition de la tâche.
resource "scaleway_secret" "scw" {
  name       = "${var.name}-scw-key"
  project_id = var.project_id
  region     = var.region
}

resource "scaleway_secret_version" "scw" {
  secret_id = scaleway_secret.scw.id
  region    = var.region
  data      = scaleway_iam_api_key.this.secret_key
}

resource "scaleway_secret" "token" {
  name       = "${var.name}-token"
  project_id = var.project_id
  region     = var.region
}

resource "scaleway_secret_version" "token" {
  secret_id = scaleway_secret.token.id
  region    = var.region
  data      = var.checkops_token
}

resource "scaleway_job_definition" "this" {
  name                   = var.name
  project_id             = var.project_id
  region                 = var.region
  description            = "CheckOps : analyse Trivy des images du registre et envoi à CheckOps"
  image_uri              = var.image
  startup_command        = ["checkops"]
  args                   = ["scaleway", "sync"]
  cpu_limit              = 1120
  memory_limit           = 2048
  local_storage_capacity = 10240
  timeout                = "2h"

  env = {
    CHECKOPS_URL            = var.checkops_url
    SCW_DEFAULT_REGION      = var.region
    SCW_DEFAULT_PROJECT_ID  = var.project_id
    CHECKOPS_SCW_NAMESPACE  = var.namespaces
    CHECKOPS_PRODUCT_PREFIX = var.product_prefix
  }

  secret_reference {
    secret_id   = scaleway_secret.scw.id
    environment = "SCW_SECRET_KEY"
  }

  secret_reference {
    secret_id   = scaleway_secret.token.id
    environment = "CHECKOPS_TOKEN"
  }

  cron {
    schedule = var.schedule
    timezone = "Europe/Paris"
  }

  depends_on = [scaleway_secret_version.scw, scaleway_secret_version.token]
}
