terraform {
  required_providers {
    checkly = {
      source  = "checkly/checkly"
      version = "~> 1.0"
    }
  }

  cloud {
    workspaces {
      name = "checkly-e2e"
    }
  }

}

variable "checkly_api_key" {
  sensitive = true
}

variable "checkly_account_id" {
  sensitive = true
}

variable "checkly_alert_channel_pagerduty_service_key" {
  sensitive = true
}

variable "checkly_alert_channel_instatus_webhook_url" {
  sensitive = true
}

variable "checkly_alert_channel_instatus_webhook_url_ingestion" {
  sensitive = true
}

provider "checkly" {
  api_key    = var.checkly_api_key
  account_id = var.checkly_account_id
}

resource "checkly_check" "plausible-io-api-health" {
  name      = "Check plausible.io/api/health"
  type      = "API"
  activated = true
  frequency = 1

  group_id = checkly_check_group.reachability.id

  retry_strategy {
    type        = "FIXED"
    max_retries = 2
  }

  alert_channel_subscription {
    channel_id = checkly_alert_channel.instatus.id
    activated  = true
  }

  request {
    url              = "https://plausible.io/api/health"
    follow_redirects = false
    skip_ssl         = false
    assertion {
      source     = "JSON_BODY"
      property   = "$.clickhouse"
      comparison = "EQUALS"
      target     = "ok"
    }
    assertion {
      source     = "JSON_BODY"
      property   = "$.postgres"
      comparison = "EQUALS"
      target     = "ok"
    }
    assertion {
      source     = "JSON_BODY"
      property   = "$.sites_cache"
      comparison = "EQUALS"
      target     = "ok"
    }
  }
}

resource "checkly_check" "plausible-io-lb-health" {
  name      = "Check ingress.lb.plausible.io/api/health"
  type      = "API"
  activated = true
  frequency = 1

  group_id = checkly_check_group.reachability.id

  retry_strategy {
    type        = "FIXED"
    max_retries = 2
  }

  request {
    url              = "https://ingress.lb.plausible.io/api/health"
    follow_redirects = false
    skip_ssl         = false
    assertion {
      source     = "JSON_BODY"
      property   = "$.clickhouse"
      comparison = "EQUALS"
      target     = "ok"
    }
    assertion {
      source     = "JSON_BODY"
      property   = "$.postgres"
      comparison = "EQUALS"
      target     = "ok"
    }
    assertion {
      source     = "JSON_BODY"
      property   = "$.sites_cache"
      comparison = "EQUALS"
      target     = "ok"
    }
  }
}

resource "checkly_check" "plausible-io-ingestion" {
  name      = "Check plausible.io/api/event"
  type      = "API"
  activated = true
  frequency = 1

  group_id = checkly_check_group.reachability.id

  retry_strategy {
    type        = "FIXED"
    max_retries = 2
  }

  request {
    url              = "https://plausible.io/api/event"
    follow_redirects = false
    skip_ssl         = false
    method           = "POST"
    headers = {
      User-Agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36 OPR/71.0.3770.284"
    }
    body_type = "JSON"
    body      = <<EOT
      {
        "name": "pageview",
        "url": "https://internal--checkly.com/",
        "domain": "internal--checkly.com",
        "width": 1666
      }
EOT

    assertion {
      source     = "STATUS_CODE"
      comparison = "EQUALS"
      target     = 202
    }
    assertion {
      source     = "TEXT_BODY"
      comparison = "EQUALS"
      target     = "ok"
    }
    assertion {
      source     = "HEADERS"
      property   = "x-plausible-dropped"
      comparison = "IS_EMPTY"
    }
  }

  alert_channel_subscription {
    channel_id = checkly_alert_channel.instatus_ingestion.id
    activated  = true
  }

}

resource "checkly_check" "plausible-io-tracker-script" {
  name      = "Check plausible.io/js/script.js"
  type      = "API"
  activated = true
  frequency = 1

  group_id = checkly_check_group.reachability.id

  retry_strategy {
    type        = "FIXED"
    max_retries = 2
  }

  request {
    url              = "https://plausible.io/js/script.js"
    follow_redirects = false
    skip_ssl         = false
    assertion {
      source     = "STATUS_CODE"
      comparison = "EQUALS"
      target     = "200"
    }
    assertion {
      source     = "TEXT_BODY"
      comparison = "CONTAINS"
      target     = "window.plausible"
    }
  }
}

resource "checkly_check" "ingest-plausible-io-ingestion" {
  name      = "Check ingest.plausible.io/api/event"
  type      = "API"
  activated = true
  frequency = 1
  group_id  = checkly_check_group.reachability.id

  retry_strategy {
    type        = "FIXED"
    max_retries = 2
  }

  request {
    url              = "https://ingest.plausible.io/api/event"
    follow_redirects = false
    skip_ssl         = false
    method           = "POST"
    headers = {
      User-Agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36 OPR/71.0.3770.284"
    }
    body_type = "JSON"
    body      = <<EOT
      {
        "name": "pageview",
        "url": "https://internal--checkly.com/",
        "domain": "internal--checkly.com",
        "width": 1666
      }
EOT

    assertion {
      source     = "STATUS_CODE"
      comparison = "EQUALS"
      target     = 202
    }
    assertion {
      source     = "TEXT_BODY"
      comparison = "EQUALS"
      target     = "ok"
    }
    assertion {
      source     = "HEADERS"
      property   = "x-plausible-dropped"
      comparison = "IS_EMPTY"
    }
  }
}

resource "checkly_check_group" "reachability" {
  name      = "Reachability probes - via automation"
  activated = true
  muted     = false
  tags      = ["terraform"]

  locations = [
    "us-east-1",
    "us-west-1",
    "eu-central-1",
    "eu-west-2",
    "eu-north-1",
    "eu-south-1",
    "ap-southeast-2"
  ]
  concurrency               = 3
  use_global_alert_settings = false

  retry_strategy {
    type        = "FIXED"
    max_retries = 2
  }

  alert_channel_subscription {
    channel_id = checkly_alert_channel.pagerduty.id
    activated  = true
  }

  alert_settings {
    escalation_type = "TIME_BASED"

    time_based_escalation {
      minutes_failing_threshold = 5
    }
  }
}

resource "checkly_alert_channel" "pagerduty" {
  pagerduty {
    account      = "plausible"
    service_key  = var.checkly_alert_channel_pagerduty_service_key
    service_name = "Plausible application"
  }
}

resource "checkly_alert_channel" "instatus" {
  webhook {
    name     = "Instatus integration"
    method   = "POST"
    template = <<EOT
  {"alert": "{{ALERT_TYPE}}"}
EOT
    url      = var.checkly_alert_channel_instatus_webhook_url
  }
}

resource "checkly_alert_channel" "instatus_ingestion" {
  webhook {
    name     = "Instatus integration - ingestion"
    method   = "POST"
    template = <<EOT
  {"alert": "{{ALERT_TYPE}}"}
EOT
    url      = var.checkly_alert_channel_instatus_webhook_url_ingestion
  }
}
