package com.criteo.dev.cluster.aws

import com.criteo.dev.cluster.config.GlobalConfig
import com.criteo.dev.cluster.{CliAction, Public}
import org.jclouds.compute.domain.NodeMetadata
import org.jclouds.compute.domain.NodeMetadata.Status
import org.joda.time.DateTime
import org.scala_tools.time.Imports._
import org.slf4j.LoggerFactory

/**
  * Purge expired AWS clusters.
  */
object PurgeAwsCliAction extends CliAction[Unit] {

  override def command: String = "purge"

  override def usageArgs: List[Any] = List()

  override def help: String = "Purge all expired Running clusters."

  override def isHidden = true

  private val logger = LoggerFactory.getLogger(PurgeAwsCliAction.getClass)

  override def applyInternal(args: List[String], config: GlobalConfig): Unit = {
    val currentTime = DateTime.now(DateTimeZone.UTC)
    val conf = config.backCompat

    logger.info(s"Running purge, current time is ${AwsUtilities.dtToString(currentTime)} (UTC)")
    val results = AwsUtilities.getAllClusters(conf).filter(c => c.master.getStatus.equals(Status.RUNNING))
    val toPurge = results.filter(c => isPurgable(c.master, currentTime))

    toPurge.foreach(u => {
      val nodeText = AwsUtilities.nodeInformation(conf, u.master)
      logger.info(s"Found node of user : ${AwsUtilities.getUser(u.master)}")
      logger.info(nodeText)
    })

    DestroyAwsCliAction.destroy(conf, toPurge)
  }

  def isPurgable(node: NodeMetadata, dt: DateTime) : Boolean = {
    val userMetadata = node.getUserMetadata
    val expireTime = userMetadata.get(AwsConstants.expireTime)
    if (expireTime == null) {
      //kill nodes without expire time
      return true
    }

    try {
      val date = AwsUtilities.stringToDt(expireTime)
      return date.isBefore(dt)
    } catch {
      //if expire time is corrupt, kill the node.
      case e: IllegalArgumentException => return true
    }
  }
}