package net.pterodactylus.rhynodge.filters.webpages.savoy import com.fasterxml.jackson.annotation.JsonProperty import kotlinx.html.a import kotlinx.html.body import kotlinx.html.div import kotlinx.html.dom.serialize import kotlinx.html.head import kotlinx.html.html import kotlinx.html.img import kotlinx.html.li import kotlinx.html.ol import kotlinx.html.section import kotlinx.html.style import kotlinx.html.title import kotlinx.html.ul import kotlinx.html.unsafe import net.pterodactylus.rhynodge.Reaction import net.pterodactylus.rhynodge.states.AbstractState import java.time.LocalDateTime import java.util.Locale class MovieState(@JsonProperty val movies: Collection, val newMovies: Collection = emptySet(), private val triggered: Boolean = false) : AbstractState() { private constructor() : this(emptySet()) override fun summary(reaction: Reaction) = "%s – Programme for %tY-% .label { font-family: Impact, sans-serif; background-color: black; padding: 0.5ex; font-size: 200%; color: #ffffee; font-weight: bold; }" +"section.new-movies ul { padding: 0; margin: 0; }" +"section.new-movies li.movie { list-style: none; display: grid; margin: 1ex 1ex 1ex 0ex; grid-template-rows: 353px; grid-template-columns: 250px auto; }" +"section.new-movies li.movie img { grid-area: 1/1/2/2; width: 100%; height: 100%; }" +"section.new-movies li.movie .text { color: white; text-shadow: 2px 2px black; font-weight: bold; font-size: 150%; display: flex; flex-direction: column; justify-content: end; grid-area: 1/1/2/2; }" +"section.new-movies li.movie .text .name { padding: 1ex; font-size: 120%; }" +"section.new-movies li.movie .description { padding: 1ex; }" +"section.daily-programmes ol { padding: 0; }" +"section.daily-programmes li { list-style: none; }" +"section.daily-programmes li.day > .label { font-family: Impact, sans-serif; background-color: black; padding: 0.5ex; font-size: 200%; color: #ffffee; font-weight: bold; }" +"section.daily-programmes li .performances { display: flex; border-top: 1ex; }" +"section.daily-programmes li.performance { width: 250px; height: 353px; display: inline-block; margin: 1ex 1ex 1ex 0ex; position: relative; }" +"section.daily-programmes li.performance a { width: 100%; height: 100%; display: block; text-decoration: none; }" +"section.daily-programmes li.performance a img { width: 100%; height: 100%; display: block; position: absolute; z-index: -1; }" +"section.daily-programmes li.performance a .text { color: white; text-shadow: 2px 2px black; font-weight: bold; font-size: 150%; width: 100%; height: 100%; }" +"section.daily-programmes li.performance a .text .time { padding: 1ex 1ex 0ex 1ex; text-align: right; }" +"section.daily-programmes li.performance a .text .type { padding: 0ex 1ex 1ex 1ex; text-align: right; }" +"section.daily-programmes li.performance a .text .name { padding: 1ex; font-size: 120%; bottom: 0px; position: absolute; }" } } } body { if (newMovies.isNotEmpty()) { section("new-movies") { div("label") { +"New Movies" } ul { newMovies.forEach { movie -> li("movie") { img(src = movie.imageUrl) div("text") { div("name") { +(movie.name) } } div("description") { +movie.description } } } } } } section("daily-programmes") { ol("days") { movies.flatMap { it.performances.map(Performance::time).map(LocalDateTime::toLocalDate) }.distinct().sorted().forEach { date -> li("day") { attributes += "data-date" to "%tY-% movie.performances.map { movie to it } } .filter { (movie, performances) -> performances.time.toLocalDate() == date } .sortedBy { (_, performance) -> performance.time } .forEach { (movie, performance) -> li("performance") { a(href = performance.link) { img(src = movie.imageUrl) div("text") { div("time") { +("%tH:%