const mangayomiSources = [
  {
    "name": "TeamX",
    "lang": "ar",
    "baseUrl": "https://olympustaff.com",
    "apiUrl": "",
    "iconUrl":
      "https://www.google.com/s2/favicons?sz=256&domain=https://olympustaff.com",
    "typeSource": "single",
    "itemType": 0,
    "version": "1.0.1",
    "pkgPath": "manga/src/ar/teamx.js"
  }
];

class DefaultExtension extends MProvider {
  constructor() {
    super();
    this.client = new Client();
    this.baseUrl = new SharedPreferences().get("overrideBaseUrl1");
  }

  //  Helper Methods

  getHeaders(url) {
    return { Referer: this.source.baseUrl };
  }

  toStatus(status) {
    return (
      {
        مستمرة: 0,
        مكتملة: 1,
        مكتمل: 1,
        متوقف: 2,
        متروك: 3,
        "قادم قريبًا": 4,
      }[status] ?? 5 // 5 => unknown
    );
  }

  hasNextPage(doc) {
    return (
      doc
        .selectFirst(".pagination li.page-item a[rel='next']")
        ?.attr("href") !== ""
    );
  }

  parseChapterDate(date) {
    return new Date(date).toISOString().split("T")[0];
  }

  async request(slug) {
    const res = await this.client.get(`${this.baseUrl}${slug}`);
    return new Document(res.body);
  }

  //  Chapters
  chapterFromElement(element) {
    const chpNum = element.selectFirst("div.epl-num")?.text.trim();
    const chpTitle = element.selectFirst("div.epl-title")?.text.trim();

    let name;
    if (chpTitle?.includes(chpNum?.replace(/[^0-9]/g, ""))) {
      name = chpTitle;
    } else if (!chpNum) {
      name = chpTitle;
    } else if (!chpTitle) {
      name = chpNum;
    } else {
      name = `${chpNum} - ${chpTitle}`;
    }

    return {
      name,
      dateUpload: this.parseChapterDate(
        element.selectFirst("div.epl-date")?.text.trim(),
      ),
      url: element.getHref,
    };
  }

  async chapterListParse(response) {
    const allElements = [];
    let doc = response;

    while (true) {
      const pageChapters = doc.select("div.eplister ul a");
      if (pageChapters.length === 0) break;

      allElements.push(...pageChapters);
      const nextPage = doc.select("a[rel=next]");
      if (nextPage.length === 0) break;

      const nextUrl = nextPage[0].attr("href");
      const nextResponse = await this.client.get(nextUrl);
      doc = new Document(nextResponse.body);
    }

    return allElements.map((element) => this.chapterFromElement(element));
  }

  //  Manga Listing
  async getMangaList(slug) {
    const doc = await this.request(`/${slug}`);
    const list = doc.select(".listupd .bsx").map((element) => ({
      name: element.selectFirst("a")?.attr("title")?.trim(),
      imageUrl: element.selectFirst("img")?.getSrc,
      link: element.getHref,
    }));

    return { list, hasNextPage: this.hasNextPage(doc) };
  }

  async getPopular(page) {
    return this.getMangaList(`series?page=${page}`);
  }

  async getLatestUpdates(page) {
    const doc = await this.request(`/?page=${page}`);
    const list = doc.select(".post-body .box").map((element) => ({
      name: element.selectFirst(".info a h3")?.text,
      imageUrl: element.selectFirst(".imgu img")?.getSrc,
      link: element.selectFirst(".imgu a")?.getHref,
    }));

    return { list, hasNextPage: this.hasNextPage(doc) };
  }

  //  Search
  async search(query, page, filters) {
    if (!query) {
      const [type, status, genre] = filters.map(
        (filter, i) => filter.values[filters[i].state]?.value,
      );
      return this.getMangaList(
        `series?page=${page}&genre=${genre}&type=${type}&status=${status}`,
      );
    }

    const doc = await this.request(`/ajax/search?keyword=${query}`);
    const list = doc.select("li.list-group-item").map((element) => ({
      name: element.selectFirst("div.ms-2 a")?.text,
      imageUrl: element.selectFirst("a img")?.getSrc,
      link: element.selectFirst("div.ms-2 a")?.getHref,
    }));

    return { list, hasNextPage: false };
  }

  //  Detail
  async getDetail(url) {
    const res = await this.client.get(url);
    const doc = new Document(res.body);

    const title = doc.selectFirst("div.author-info-title h1")?.text.trim();
    const imageUrl = doc.selectFirst("img.shadow-sm")?.getSrc;
    const description = doc.selectFirst(".review-content > p")?.text.trim();

    const author = doc
      .selectFirst(
        ".full-list-info > small:first-child:contains(الرسام) + small",
      )
      ?.text?.trim();

    const status = this.toStatus(
      doc
        .selectFirst(
          ".full-list-info > small:first-child:contains(الحالة) + small",
        )
        ?.text?.trim(),
    );

    const genre = doc
      .select("div.review-author-info a")
      .map((e) => e.text.trim());

    const chapters = await this.chapterListParse(doc);

    return {
      title,
      imageUrl,
      description,
      author: author && author !== "غير معروف" ? author : null,
      status,
      genre,
      chapters,
    };
  }

  //  chapter pages
  async getPageList(url) {
    const res = await this.client.get(url);
    const doc = new Document(res.body);

    return doc.select("div.image_list img[src]").map((x) => ({
      url: x.attr("src"),
    }));
  }

  //  Filter
  getFilterList() {
    return [
      {
        type_name: "SelectFilter",
        name: "النوع",
        values: [
          ["اختر النوع", ""],
          ["مانها صيني", "مانها صيني"],
          ["مانجا ياباني", "مانجا ياباني"],
          ["ويب تون انجليزية", "ويب تون انجليزية"],
          ["مانهوا كورية", "مانهوا كورية"],
          ["ويب تون يابانية", "ويب تون يابانية"],
          ["عربي", "عربي"],
        ].map((x) => ({
          type_name: "SelectOption",
          name: x[0],
          value: x[1],
        })),
      },
      {
        type_name: "SelectFilter",
        name: "الحالة",
        values: [
          ["اختر الحالة", ""],
          ["مستمرة", "مستمرة"],
          ["متوقف", "متوقف"],
          ["مكتمل", "مكتمل"],
          ["قادم قريبًا", "قادم قريبًا"],
          ["متروك", "متروك"],
        ].map((x) => ({
          type_name: "SelectOption",
          name: x[0],
          value: x[1],
        })),
      },
      {
        type_name: "SelectFilter",
        name: "التصنيف",
        values: [
          ["اختر التصنيف", ""],
          ["أكشن", "أكشن"],
          ["إثارة", "إثارة"],
          ["إيسيكاي", "إيسيكاي"],
          ["بطل غير إعتيادي", "بطل غير إعتيادي"],
          ["خيال", "خيال"],
          ["دموي", "دموي"],
          ["نظام", "نظام"],
          ["صقل", "صقل"],
          ["قوة خارقة", "قوة خارقة"],
          ["فنون قتال", "فنون قتال"],
          ["غموض", "غموض"],
          ["وحوش", "وحوش"],
          ["شونين", "شونين"],
          ["حريم", "حريم"],
          ["خيال علمي", "خيال علمي"],
          ["مغامرات", "مغامرات"],
          ["دراما", "دراما"],
          ["خارق للطبيعة", "خارق للطبيعة"],
          ["سحر", "سحر"],
          ["كوميدي", "كوميدي"],
          ["ويب تون", "ويب تون"],
          ["زمكاني", "زمكاني"],
          ["رومانسي", "رومانسي"],
          ["شياطين", "شياطين"],
          ["فانتازيا", "فانتازيا"],
          ["عنف", "عنف"],
          ["ملائكة", "ملائكة"],
          ["بعد الكارثة", "بعد الكارثة"],
          ["إعادة إحياء", "إعادة إحياء"],
          ["اعمار", "اعمار"],
          ["ثأر", "ثأر"],
          ["زنزانات", "زنزانات"],
          ["تاريخي", "تاريخي"],
          ["حرب", "حرب"],
          ["خارق", "خارق"],
          ["سنين", "سنين"],
          ["عسكري", "عسكري"],
          ["بوليسي", "بوليسي"],
          ["حياة مدرسية", "حياة مدرسية"],
          ["واقع افتراضي", "واقع افتراضي"],
          ["داخل لعبة", "داخل لعبة"],
          ["داخل رواية", "داخل رواية"],
          ["الحياة اليومية", "الحياة اليومية"],
          ["رعب", "رعب"],
          ["طبخ", "طبخ"],
          ["مدرسي", "مدرسي"],
          ["زومبي", "زومبي"],
          ["شوجو", "شوجو"],
          ["معالج", "معالج"],
          ["شريحة من الحياة", "شريحة من الحياة"],
          ["نفسي", "نفسي"],
          ["تاريخ", "تاريخ"],
          ["أكاديمية", "أكاديمية"],
          ["أرواح", "أرواح"],
          ["تراجيدي", "تراجيدي"],
          ["ابراج", "ابراج"],
          ["رياضي", "رياضي"],
          ["مصاص دماء", "مصاص دماء"],
          ["طبي", "طبي"],
          ["مأساة", "مأساة"],
          ["إيتشي", "إيتشي"],
          ["انتقام", "انتقام"],
          ["جوسي", "جوسي"],
          ["موريم", "موريم"],
          ["لعبة فيديو", "لعبة فيديو"],
          ["مغني", "مغني"],
          ["تشويق", "تشويق"],
          ["نجاة", "نجاة"],
          ["الجانب المظلم من الحياة", "الجانب المظلم من الحياة"],
          ["سينين", "سينين"],
          ["تنمر", "تنمر"],
          ["حيوانات أليفة", "حيوانات أليفة"],
          ["شرطة", "شرطة"],
          ["الخيال العلمي", "الخيال العلمي"],
          ["حشرات", "حشرات"],
          ["عوالم", "عوالم"],
          ["ممالك", "ممالك"],
          ["مؤامرات", "مؤامرات"],
          ["تخطيط", "تخطيط"],
          ["سفر عبر الأبعاد", "سفر عبر الأبعاد"],
          ["جواسيس", "جواسيس"],
          ["بطل مخطط", "بطل مخطط"],
          ["ممثل", "ممثل"],
        ].map((x) => ({
          type_name: "SelectOption",
          name: x[0],
          value: x[1],
        })),
      },
    ];
  }

  //  Preferences
  getSourcePreferences() {
    return [
      {
        key: "overrideBaseUrl1",
        editTextPreference: {
          title: "Override BaseUrl",
          summary: "https://olympustaff.com",
          value: "https://olympustaff.com",
          dialogTitle: "Override BaseUrl",
          dialogMessage: "",
        },
      },
    ];
  }

  //  Unimplemented Methods
  get supportsLatest() {
    throw new Error("Method not implemented: supportsLatest");
  }

  async getHtmlContent(url) {
    throw new Error("Method not implemented: getHtmlContent");
  }

  async cleanHtmlContent(html) {
    throw new Error("Method not implemented: cleanHtmlContent");
  }

  // For anime episode video list
  async getVideoList(url) {
    throw new Error("Method not implemented: getVideoList");
  }
}
