package codecheck.github.models

import org.json4s.JValue
import codecheck.github.utils.ToDo

sealed abstract class RepositoryListType(val name: String) {
  override def toString = name
}

object RepositoryListType {
  case object all extends RepositoryListType("all")
  case object owner extends RepositoryListType("owner")
  case object public extends RepositoryListType("public")
  case object private_ extends RepositoryListType("private")
  case object member extends RepositoryListType("member")
  case object forks extends RepositoryListType("forks")
  case object sources extends RepositoryListType("sources")

  val values = Array(all, owner, public, private_, member, forks, sources)

  def fromString(str: String) = if (str == "private") {
    private_
  } else {
    values.filter(_.name == str).head
  }
}

sealed abstract class RepositorySort(val name: String) {
  override def toString = name
}

object RepositorySort {
  case object created extends RepositorySort("created")
  case object updated extends RepositorySort("updated")
  case object pushed extends RepositorySort("pushed")
  case object full_name extends RepositorySort("full_name")

  val values = Array(created, updated, pushed, full_name)

  def fromString(str: String) = values.filter(_.name == str).head
}

case class RepositoryListOption(
  listType: RepositoryListType = RepositoryListType.all,
  sort: RepositorySort = RepositorySort.full_name,
  direction: SortDirection = SortDirection.asc
)

/*case*/ class RepositoryInput extends ToDo

case class Repository(value: JValue) extends AbstractJson(value) {
  def id = get("id").toLong
  def name = get("name")
  def full_name = get("full_name")
  def url = get("url")
  def language = get("language")
  def stargazers_count = get("stargazers_count")

  def description = opt("description")
  def open_issues_count = get("open_issues_count").toInt

  lazy val permissions = Permissions(value \ "permissions")
  lazy val owner = User(value \ "owner")
}

case class Permissions(value: JValue) extends AbstractJson(value) {
  def admin = boolean("admin")
  def push = boolean("push")
  def pull = boolean("pull")
}