package com.github.ehsanyou.sbt.docker.compose

import com.github.ehsanyou.sbt.docker.compose.DataTypes.Cwd
import com.github.ehsanyou.sbt.docker.compose.DataTypes.InvalidExitCodeException
import sbt.Def
import sbt._

import scala.concurrent.Future
import scala.sys.process.Process

package object helpers {

  implicit def stateToExtracted(state: State): Extracted = Project.extract(state)

  object sbtFutureTask {
    def apply[T](t: T): Future[Def.Initialize[Task[T]]] = Future.successful(Def task t)
    def empty: Future[Def.Initialize[Task[Unit]]] = apply(())
  }

  object sbtTask {
    def empty: Def.Initialize[Task[Unit]] = Def task (())
  }

  def redPrinter(str: String): Unit = println(scala.Console.RED + str + scala.Console.WHITE)
  def greenPrinter(str: String): Unit = println(scala.Console.GREEN + str + scala.Console.WHITE)
  def yellowPrinter(str: String): Unit = println(scala.Console.YELLOW + str + scala.Console.WHITE)

  def process[T](
    command: String
  )(
    onSuccess: => T
  )(
    implicit cwd: Cwd
  ): T = {
    if (Process(command, cwd.dir).! == 0) onSuccess
    else throw new InvalidExitCodeException(s"`$command` command returned non-zero exit code.")
  }

  def processNonBlocking(
    command: String
  )(
    implicit cwd: Cwd
  ): Process =
    Process(command, cwd.dir).run()
}