From 900470df5aba15b068bfbd8b4948682936a83f4e Mon Sep 17 00:00:00 2001
From: Ota <106656898+Opi-Txm@users.noreply.github.com>
Date: Mon, 11 Dec 2023 15:40:51 +0100
Subject: [PATCH] Readcomiconline: Added new filters (#19262)

---
 src/en/readcomiconline/build.gradle           |  2 +-
 .../en/readcomiconline/Readcomiconline.kt     | 92 +++++++++++++++----
 2 files changed, 77 insertions(+), 17 deletions(-)

diff --git a/src/en/readcomiconline/build.gradle b/src/en/readcomiconline/build.gradle
index 50e3e0771..fc50f4187 100644
--- a/src/en/readcomiconline/build.gradle
+++ b/src/en/readcomiconline/build.gradle
@@ -5,7 +5,7 @@ ext {
     extName = 'ReadComicOnline'
     pkgNameSuffix = 'en.readcomiconline'
     extClass = '.Readcomiconline'
-    extVersionCode = 16
+    extVersionCode = 17
 }
 
 dependencies {
diff --git a/src/en/readcomiconline/src/eu/kanade/tachiyomi/extension/en/readcomiconline/Readcomiconline.kt b/src/en/readcomiconline/src/eu/kanade/tachiyomi/extension/en/readcomiconline/Readcomiconline.kt
index e719b7cff..ea42b7fe6 100644
--- a/src/en/readcomiconline/src/eu/kanade/tachiyomi/extension/en/readcomiconline/Readcomiconline.kt
+++ b/src/en/readcomiconline/src/eu/kanade/tachiyomi/extension/en/readcomiconline/Readcomiconline.kt
@@ -99,23 +99,58 @@ class Readcomiconline : ConfigurableSource, ParsedHttpSource() {
 
     override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector()
 
-    override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
-        val url = "$baseUrl/AdvanceSearch".toHttpUrl().newBuilder().apply {
-            addQueryParameter("comicName", query.trim())
-            addQueryParameter("page", page.toString())
-            for (filter in if (filters.isEmpty()) getFilterList() else filters) {
-                when (filter) {
-                    is Status -> addQueryParameter("status", arrayOf("", "Completed", "Ongoing")[filter.state])
-                    is GenreList -> {
-                        addQueryParameter("ig", filter.included.joinToString(","))
-                        addQueryParameter("eg", filter.excluded.joinToString(","))
-                    }
-                    else -> {}
-                }
-            }
-        }.build()
+    override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { // publisher > writer > artist + sorting for both if else
+        if (query.isEmpty() && (if (filters.isEmpty()) getFilterList() else filters).filterIsInstance<GenreList>().all { it.included.isEmpty() && it.excluded.isEmpty() }) {
+            val url = baseUrl.toHttpUrl().newBuilder().apply {
+                var pathSegmentAdded = false
 
-        return GET(url, headers)
+                for (filter in if (filters.isEmpty()) getFilterList() else filters) {
+                    when (filter) {
+                        is PublisherFilter -> {
+                            if (filter.state.isNotEmpty()) {
+                                addPathSegments("Publisher/${filter.state.replace(" ", "-")}")
+                                pathSegmentAdded = true
+                            }
+                        }
+                        is WriterFilter -> {
+                            if (filter.state.isNotEmpty()) {
+                                addPathSegments("Writer/${filter.state.replace(" ", "-")}")
+                                pathSegmentAdded = true
+                            }
+                        }
+                        is ArtistFilter -> {
+                            if (filter.state.isNotEmpty()) {
+                                addPathSegments("Artist/${filter.state.replace(" ", "-")}")
+                                pathSegmentAdded = true
+                            }
+                        }
+                        else -> {}
+                    }
+
+                    if (pathSegmentAdded) {
+                        break
+                    }
+                }
+                addPathSegment((if (filters.isEmpty()) getFilterList() else filters).filterIsInstance<SortFilter>().first().selected.toString())
+            }.build()
+            return GET(url, headers)
+        } else {
+            val url = "$baseUrl/AdvanceSearch".toHttpUrl().newBuilder().apply {
+                addQueryParameter("comicName", query.trim())
+                addQueryParameter("page", page.toString())
+                for (filter in if (filters.isEmpty()) getFilterList() else filters) {
+                    when (filter) {
+                        is Status -> addQueryParameter("status", arrayOf("", "Completed", "Ongoing")[filter.state])
+                        is GenreList -> {
+                            addQueryParameter("ig", filter.included.joinToString(","))
+                            addQueryParameter("eg", filter.excluded.joinToString(","))
+                        }
+                        else -> {}
+                    }
+                }
+            }.build()
+            return GET(url, headers)
+        }
     }
 
     override fun searchMangaSelector() = popularMangaSelector()
@@ -203,10 +238,35 @@ class Readcomiconline : ConfigurableSource, ParsedHttpSource() {
         val excluded: List<String>
             get() = state.filter { it.isExcluded() }.map { it.gid }
     }
+    open class SelectFilter(displayName: String, private val options: Array<Pair<String, String>>) : Filter.Select<String>(
+        displayName,
+        options.map { it.first }.toTypedArray(),
+    ) {
+        open val selected get() = options[state].second.takeUnless { it.isEmpty() }
+    }
+
+    private class PublisherFilter() : Filter.Text("Publisher")
+    private class WriterFilter() : Filter.Text("Writer")
+    private class ArtistFilter() : Filter.Text("Artist")
+    private class SortFilter : SelectFilter(
+        "Sort By",
+        arrayOf(
+            Pair("Alphabet", ""),
+            Pair("Popularity", "MostPopular"),
+            Pair("Latest Update", "LatestUpdate"),
+            Pair("New Comic", "Newest"),
+        ),
+    )
 
     override fun getFilterList() = FilterList(
         Status(),
         GenreList(getGenreList()),
+        Filter.Separator(),
+        Filter.Header("Filters below is ignored when Status,Genre or the queue is not empty."),
+        SortFilter(),
+        PublisherFilter(),
+        WriterFilter(),
+        ArtistFilter(),
     )
 
     // $("select[name=\"genres\"]").map((i,el) => `Genre("${$(el).next().text().trim()}", ${i})`).get().join(',\n')