package com.goyeau.kubernetes.client.operation

import scala.concurrent.duration._
import cats.Applicative
import cats.effect.Timer
import cats.implicits._
import io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions
import org.http4s._
import org.http4s.client.dsl.Http4sClientDsl

private[client] trait DeletableTerminated[F[_]] extends Http4sClientDsl[F] { this: Deletable[F] =>

  def deleteTerminated(name: String, deleteOptions: Option[DeleteOptions] = None)(implicit
      timer: Timer[F]
  ): F[Status] = {
    def deleteTerminated(firstTry: Boolean): F[Status] = {
      def retry() = timer.sleep(1.second) *> deleteTerminated(firstTry = false)

      delete(name, deleteOptions).flatMap {
        case status if status.isSuccess => retry()
        case Status.Conflict            => retry()
        case response @ Status.NotFound =>
          if (firstTry) Applicative[F].pure(response) else Applicative[F].pure(Status.Ok)
        case error => Applicative[F].pure(error)
      }
    }

    deleteTerminated(firstTry = true)
  }
}