import scala.io.Source
import java.net.URL
import sys.process._
import scala.io.Source

import scala.concurrent.{Await, Future}
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global

def isImage(url: String): Boolean = {
    val connection = URL(url).openConnection()
    connection.setDoOutput(false)
    val contentType = connection.getHeaderField("Content-Type")

    contentType match {
        case null => return false
        case contentType: String => contentType.startsWith("image/")
    }
}

@main
def imagePager(kittyString: String, newsboatArticle: String) = {
    val kitty = kittyString.toBoolean

    val urlPattern = """https?://\S+""".r

    val images = Source.fromFile(newsboatArticle)
        .getLines
        .flatMap(urlPattern.findAllIn(_))
        .map(url => Future { (url, isImage(url)) })
        .toList

    val filteredImages = Await.result(Future.sequence(images), Duration.Inf)
        .collect { case (url, true) => url }

    if (!filteredImages.isEmpty) {
        kitty match {
            case true => {
                //val cols = s"tput cols".!!
                //val lines = s"tput lines".!!
                //val dimensions = s"${cols}x${lines}@0x0".replaceAll("\n", "")

                // This code is mostly from @heussd's kitty-imager-pager.sh bash script
                // for rendering images with kitty (pull request #1956 on newsboat)
                val kittyImages = filteredImages
                    .map(image => s"kitty +kitten icat --hold --scale-up --place \"$$dims\" $image")
                    .toSeq

                (Seq(
                    "dims=\"$(tput cols)x$(tput lines)@0x0\"",
                    "clear",
                    "kitty +kitten icat --clear",
                ) ++ kittyImages :+ "clear").foreach(println)
            }
            case false => s"feh ${filteredImages.mkString(" ")}".!!
        }
    }
}