#!/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|bugs> <--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 = ""
    bugs = False

    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/"
    elif sys.argv[1].strip().lower() == "bugs":
        news = await client.parser.news.bugs()
        bugs = True
    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("Выгружаю...")

        if not bugs:
            # 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:
            if bugs:
                if _show:
                    print(f"Быстро закрытые: {len(news.quickly_resolved or [])}\n")

                if not _noexport:
                    __f.write(f"Быстро закрытые: {len(news.quickly_resolved or [])}\n\n")

                if len(news.quickly_resolved or [])>0:
                    for bug in news.quickly_resolved or []:
                        if _show:
                            print(f"#{bug.id}: {bug.component} - {bug.status}")
                            print(f"{bug.summary}\n")

                        if not _noexport:
                            __f.write(f"#{bug.id}: {bug.component} - {bug.status}\n")
                            __f.write(f"{bug.summary}\n\n")

                if _show:
                    print(f"Новые баги: {len(news.new or [])}\n")

                if not _noexport:
                    __f.write(f"Новые баги: {len(news.new or [])}\n\n")

                if len(news.new or [])>0:
                    for bug in news.new or []:
                        if _show:
                            print(f"#{bug.id}: {bug.component} - {bug.status}")
                            print(f"{bug.summary}\n")

                        if not _noexport:
                            __f.write(f"#{bug.id}: {bug.component} - {bug.status}\n")
                            __f.write(f"{bug.summary}\n\n")

                if _show:
                    print(f"Закрытые баги: {len(news.resolved or [])}\n")

                if not _noexport:
                    __f.write(f"Закрытые баги: {len(news.resolved or [])}\n\n")

                if len(news.resolved or [])>0:
                    for bug in news.resolved or []:
                        if _show:
                            print(f"#{bug.id}: {bug.component} - {bug.status}")
                            print(f"{bug.summary}\n")

                        if not _noexport:
                            __f.write(f"#{bug.id}: {bug.component} - {bug.status}\n")
                            __f.write(f"{bug.summary}\n\n")

                if _show:
                    print(f"Переоткрытые баги: {len(news.reopened or [])}\n")

                if not _noexport:
                    __f.write(f"Переоткрытые баги: {len(news.reopened or [])}\n\n")

                if len(news.reopened or [])>0:
                    for bug in news.reopened or []:
                        if _show:
                            print(f"#{bug.id}: {bug.component} - {bug.status}")
                            print(f"{bug.summary}\n")

                        if not _noexport:
                            __f.write(f"#{bug.id}: {bug.component} - {bug.status}\n")
                            __f.write(f"{bug.summary}\n\n")

                if _show:
                    print(f"Произвольные баги: {len(news.random or [])}\n")

                if not _noexport:
                    __f.write(f"Произвольные баги: {len(news.random or [])}\n\n")

                if len(news.random or [])>0:
                    for bug in news.random or []:
                        if _show:
                            print(f"#{bug.id}: {bug.component} - {bug.status}")
                            print(f"{bug.summary}\n")

                        if not _noexport:
                            __f.write(f"#{bug.id}: {bug.component} - {bug.status}\n")
                            __f.write(f"{bug.summary}\n\n")

            else:
                flagcount = True
                translated = GoogleTranslator(source="auto", target="ru")
                if _show:
                    print(f"Добавлено: {len(news.added or [])}\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")

                        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")

                    if not _noexport:
                        __f.write(f"{pkg.maintainer_name} ({pkg.maintainer_nick})\n\n")

                if _show:
                    print(f"\nУдалено: {len(news.removed or [])}\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")

                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")

                        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")

                    if not _noexport:
                        __f.write(f"{pkg.maintainer_name} ({pkg.maintainer_nick})\n\n")

                if _show:
                    print(f"\nВсего: {news.total}\n")
                    print(f"sisyphus-cybertalk: {news.url}\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)
