#!/usr/bin/python3
#
# Name: export-cybertalk
# Autors: Aleksandr Shamaraev <shad@altlinux.org>
#         Kirill Unitsaev <fiersik@altlinux.org>
# License: AGPL-3.0-or-later
# URL: https://altlinux.space/shad

import asyncio
import os
import sys

from altrepo import ALTRepo, ALTRepoConfig
from pathlib import Path
from deep_translator import GoogleTranslator

_error = "Правильный запуск: export-cybertalk <p11|sisyphus> <--show> <--no-export>"

home = Path.home()

async def export_cybertalk():

    config = ALTRepoConfig(
        appstream_dir = home / ".cache" / "export-cybertalk" / "appstream",
        appstream_branches=["sisyphus", "p11"],
    )

    client = ALTRepo(config=config)

    await client.init()
    link = ""

    if sys.argv[1].strip().lower() == "sisyphus":
        news = await client.parser.news.sisyphus()
        link = "https://packages.altlinux.org/ru/sisyphus/srpms/"
    elif sys.argv[1].strip().lower() == "p11":
        news = await client.parser.news.p11()
        link = "https://packages.altlinux.org/ru/p11/srpms/"
    else:
        print("Ошибка запуска.\n" + _error)
        await client.close()
        sys.exit()

    if news:
        if len(sys.argv) > 3:
            _show = True if sys.argv[2].strip().lower() == "--show" else False
            _noexport = True if sys.argv[3].strip().lower() == "--no-export" else False
        else:
            _noexport = False
            if len(sys.argv) > 2:
                _show = True if sys.argv[2].strip().lower() == "--show" else False
            else:
                _show = False

        if not _noexport:
            print("Выгружаю...")

        # sorting block - thnx fiersik@ ---
        for filed in ("added", "updated"):
            setattr(
                news,
                filed,
                sorted(
                    getattr(news, filed) or [],
                    key=lambda x: x.maintainer_name,
                )
                or None,
            )
        # --------------

        if os.path.exists(home / "export-cybertalk.txt"):
            os.remove(home / "export-cybertalk.txt")

        with open(home / "export-cybertalk.txt", "w") as __f:
            flagcount = True
            translated = GoogleTranslator(source="auto", target="ru")
            if _show:
                print(f"Добавлено: {len(news.added or [])}\n\n")
            if not _noexport:
                __f.write(f"Добавлено: {len(news.added or [])}\n\n")

            for pkg in news.added or []:

                if flagcount:
                    maintainer_name = pkg
                if maintainer_name.maintainer_name != pkg.maintainer_name:
                    if _show:
                        print(f"{maintainer_name.maintainer_name} ({maintainer_name.maintainer_nick})\n\n")
                    if not _noexport:
                        __f.write(f"{maintainer_name.maintainer_name} ({maintainer_name.maintainer_nick})\n\n")

                if _show:
                    print(
                        f"{pkg.name} ({link}{pkg.name}) - {translated.translate(pkg.description)}\n"
                    )
                if not _noexport:
                    __f.write(
                        f"{pkg.name} ({link}{pkg.name}) - {translated.translate(pkg.description)}\n"
                    )

                if flagcount:
                    flagcount = False
                maintainer_name = pkg

            if len(news.added or []) > 0:
                if _show:
                    print(f"{pkg.maintainer_name} ({pkg.maintainer_nick})\n\n")
                if not _noexport:
                    __f.write(f"{pkg.maintainer_name} ({pkg.maintainer_nick})\n\n")

            if _show:
                print(f"\nУдалено: {len(news.removed or [])}\n\n")
            if not _noexport:
                __f.write(f"\nУдалено: {len(news.removed or [])}\n\n")
            for pkg in news.removed or []:
                if _show:
                    print(f"{pkg.name} ({link}{pkg.name})\n")
                if not _noexport:
                    __f.write(f"{pkg.name} ({link}{pkg.name})\n")

            flagcount = True

            if _show:
                print(f"\nОбновлено: {len(news.updated or [])}\n\n")
            if not _noexport:
                __f.write(f"\nОбновлено: {len(news.updated or [])}\n\n")
            for pkg in news.updated or []:

                if flagcount:
                    maintainer_name = pkg
                if maintainer_name.maintainer_name != pkg.maintainer_name:
                    if _show:
                        print(f"{maintainer_name.maintainer_name} ({maintainer_name.maintainer_nick})\n\n")
                    if not _noexport:
                        __f.write(f"{maintainer_name.maintainer_name} ({maintainer_name.maintainer_nick})\n\n")

                if _show:
                    print(
                        f"{pkg.name} ({link}{pkg.name}) - {translated.translate(pkg.description)}\n"
                    )
                if not _noexport:
                    __f.write(
                        f"{pkg.name} ({link}{pkg.name}) - {translated.translate(pkg.description)}\n"
                    )

                if flagcount:
                    flagcount = False
                maintainer_name = pkg

            if len(news.updated or []) > 0:
                if _show:
                    print(f"{pkg.maintainer_name} ({pkg.maintainer_nick})\n\n")
                if not _noexport:
                    __f.write(f"{pkg.maintainer_name} ({pkg.maintainer_nick})\n\n")
            if _show:
                print(f"\nВсего: {news.total}\n\n")
                print(f"sisyphus-cybertalk: {news.url}\n\n")
            if not _noexport:
                __f.write(f"\nВсего: {news.total}\n\n")
                __f.write(f"sisyphus-cybertalk: {news.url}\n\n")
        if not _noexport:
            print(f"Выгружено в - {home}/export-cybertalk.txt")
    else:
        print("Новостей нет")
    await client.close()


if len(sys.argv) > 1:
    asyncio.run(export_cybertalk())
else:
    print(_error)
