import requests
from datetime import datetime

class PyPiSync:
    def __init__(self):
        """
        این سازنده URL پایه API PyPI را تنظیم می‌کند.
        """
        self.base_url = "https://pypi.org/pypi/"

    def get_package_info(self, package_name):
        """
        دریافت اطلاعات پکیج از PyPI به صورت سینک.

        :param package_name: نام پکیج که می‌خواهید اطلاعات آن را دریافت کنید.
        :return: اطلاعات پکیج به صورت JSON.
        :raises ValueError: اگر پکیج پیدا نشود.
        """
        url = f"{self.base_url}{package_name}/json"
        response = requests.get(url)
        if response.status_code == 200:
            return response.json()
        else:
            raise ValueError(f"Package {package_name} not found!")

    def get_releases(self, package_name):
        """
        دریافت ورژن‌های پکیج.

        :param package_name: نام پکیج که می‌خواهید ورژن‌های آن را دریافت کنید.
        :return: لیستی از ورژن‌های پکیج.
        """
        package_info = self.get_package_info(package_name)
        return {"releases": list(package_info.get('releases', {}).keys())}

    def is_package_updated(self, package_name):
        """
        بررسی اینکه آیا پکیج به‌روزرسانی شده است یا خیر (آخرین آپدیت کمتر از 30 روز پیش).

        :param package_name: نام پکیج که می‌خواهید بررسی کنید.
        :return: دیکشنری با وضعیت به‌روزرسانی (is_updated).
        """
        package_info = self.get_package_info(package_name)
        versions = package_info.get('releases', {}).keys()
        latest_version = sorted(versions, reverse=True)[0]
        last_updated = package_info.get('releases', {}).get(latest_version, [])[0].get('upload_time')
        last_updated_datetime = datetime.strptime(last_updated, "%Y-%m-%dT%H:%M:%S")
        current_time = datetime.now()
        time_difference = current_time - last_updated_datetime
        return {"is_updated": time_difference.days <= 30}

    def show_package_author_info(self, package_name):
        """
        دریافت اطلاعات نویسنده پکیج.

        :param package_name: نام پکیج که می‌خواهید اطلاعات نویسنده آن را دریافت کنید.
        :return: دیکشنری شامل نام نویسنده و ایمیل نویسنده.
        """
        package_info = self.get_package_info(package_name)
        author = package_info.get('info', {}).get('author', 'Unknown')
        author_email = package_info.get('info', {}).get('author_email', 'Unknown')
        return {"author": author, "author_email": author_email}

    def show_last_update_date(self, package_name):
        """
        دریافت تاریخ آخرین آپدیت پکیج.

        :param package_name: نام پکیج که می‌خواهید تاریخ آخرین آپدیت آن را دریافت کنید.
        :return: تاریخ آخرین آپدیت پکیج.
        """
        package_info = self.get_package_info(package_name)
        versions = package_info.get('releases', {}).keys()
        latest_version = sorted(versions, reverse=True)[0]
        last_updated = package_info.get('releases', {}).get(latest_version, [])[0].get('upload_time')
        last_updated_datetime = datetime.strptime(last_updated, "%Y-%m-%dT%H:%M:%S")
        return {"last_update_date": last_updated_datetime.strftime("%Y-%m-%d %H:%M:%S")}

    def get_popular_packages(self, limit=10):
        """
        دریافت لیستی از پکیج‌های محبوب.

        :param limit: تعداد پکیج‌هایی که می‌خواهید از لیست محبوب دریافت کنید.
        :return: لیستی از پکیج‌های محبوب به فرمت HTML.
        :raises ValueError: اگر در دریافت پکیج‌های محبوب مشکلی پیش بیاید.
        """
        url = "https://pypi.org/stats/"
        response = requests.get(url)
        if response.status_code == 200:
            return {"popular_packages": response.text}  # Display the results in HTML
        else:
            raise ValueError("Error fetching popular packages.")

    def get_package_url(self, package_name):
        """
        دریافت URL صفحه خانه پکیج.

        :param package_name: نام پکیج که می‌خواهید URL آن را دریافت کنید.
        :return: URL صفحه خانه پکیج.
        """
        package_info = self.get_package_info(package_name)
        return {"home_page": package_info.get('info', {}).get('home_page', 'Homepage not available.')}

    def get_first_release_date(self, package_name):
        """
        دریافت تاریخ اولین انتشار پکیج.

        :param package_name: نام پکیج که می‌خواهید تاریخ اولین انتشار آن را دریافت کنید.
        :return: تاریخ اولین انتشار پکیج.
        """
        package_info = self.get_package_info(package_name)
        first_release = package_info.get('releases', {}).get('0.1', [])
        if first_release:
            first_release_date = first_release[0].get('upload_time')
            first_release_datetime = datetime.strptime(first_release_date, "%Y-%m-%dT%H:%M:%S")
            return {"first_release_date": first_release_datetime.strftime("%Y-%m-%d %H:%M:%S")}
        else:
            return {"first_release_date": "First release date not available."}

    def check_package_status(self, package_name):
        """
        بررسی وضعیت موجودیت پکیج.

        :param package_name: نام پکیج که می‌خواهید وضعیت آن را بررسی کنید.
        :return: دیکشنری که شامل وضعیت موجودیت پکیج است.
        """
        try:
            self.get_package_info(package_name)
            return {"status": True}
        except:
            return {"status": False}

import aiohttp
import asyncio
from datetime import datetime

class PyPiAsync:
    def __init__(self):
        """
        این سازنده URL پایه API PyPI را تنظیم می‌کند.
        """
        self.base_url = "https://pypi.org/pypi/"

    async def get_package_info(self, package_name):
        """
        دریافت اطلاعات پکیج به صورت آسنکرون از PyPI.

        :param package_name: نام پکیج که می‌خواهید اطلاعات آن را دریافت کنید.
        :return: اطلاعات پکیج به صورت JSON.
        :raises ValueError: اگر پکیج پیدا نشود.
        """
        url = f"{self.base_url}{package_name}/json"
        async with aiohttp.ClientSession() as session:
            async with session.get(url) as response:
                if response.status == 200:
                    return await response.json()
                else:
                    raise ValueError(f"Package {package_name} not found!")

    async def get_releases(self, package_name):
        """
        دریافت ورژن‌های پکیج به صورت آسنکرون.

        :param package_name: نام پکیج که می‌خواهید ورژن‌های آن را دریافت کنید.
        :return: لیستی از ورژن‌های پکیج.
        """
        package_info = await self.get_package_info(package_name)
        return {"releases": list(package_info.get('releases', {}).keys())}

    async def is_package_updated(self, package_name):
        """
        بررسی اینکه آیا پکیج به‌روزرسانی شده است یا خیر (آخرین آپدیت کمتر از 30 روز پیش).

        :param package_name: نام پکیج که می‌خواهید بررسی کنید.
        :return: دیکشنری با وضعیت به‌روزرسانی (is_updated).
        """
        package_info = await self.get_package_info(package_name)
        versions = package_info.get('releases', {}).keys()
        latest_version = sorted(versions, reverse=True)[0]
        last_updated = package_info.get('releases', {}).get(latest_version, [])[0].get('upload_time')
        last_updated_datetime = datetime.strptime(last_updated, "%Y-%m-%dT%H:%M:%S")
        current_time = datetime.now()
        time_difference = current_time - last_updated_datetime
        return {"is_updated": time_difference.days <= 30}

    async def show_package_author_info(self, package_name):
        """
        دریافت اطلاعات نویسنده پکیج به صورت آسنکرون.

        :param package_name: نام پکیج که می‌خواهید اطلاعات نویسنده آن را دریافت کنید.
        :return: دیکشنری شامل نام نویسنده و ایمیل نویسنده.
        """
        package_info = await self.get_package_info(package_name)
        author = package_info.get('info', {}).get('author', 'Unknown')
        author_email = package_info.get('info', {}).get('author_email', 'Unknown')
        return {"author": author, "author_email": author_email}

    async def show_last_update_date(self, package_name):
        """
        دریافت تاریخ آخرین آپدیت پکیج به صورت آسنکرون.

        :param package_name: نام پکیج که می‌خواهید تاریخ آخرین آپدیت آن را دریافت کنید.
        :return: تاریخ آخرین آپدیت پکیج.
        """
        package_info = await self.get_package_info(package_name)
        versions = package_info.get('releases', {}).keys()
        latest_version = sorted(versions, reverse=True)[0]
        last_updated = package_info.get('releases', {}).get(latest_version, [])[0].get('upload_time')
        last_updated_datetime = datetime.strptime(last_updated, "%Y-%m-%dT%H:%M:%S")
        return {"last_update_date": last_updated_datetime.strftime("%Y-%m-%d %H:%M:%S")}

    async def get_popular_packages(self, limit=10):
        """
        دریافت لیستی از پکیج‌های محبوب به صورت آسنکرون.

        :param limit: تعداد پکیج‌هایی که می‌خواهید از لیست محبوب دریافت کنید.
        :return: لیستی از پکیج‌های محبوب به فرمت HTML.
        :raises ValueError: اگر در دریافت پکیج‌های محبوب مشکلی پیش بیاید.
        """
        async with aiohttp.ClientSession() as session:
            async with session.get("https://pypi.org/stats/") as response:
                if response.status == 200:
                    return {"popular_packages": await response.text()}
                else:
                    raise ValueError("Error fetching popular packages.")

    async def get_package_url(self, package_name):
        """
        دریافت URL صفحه خانه پکیج به صورت آسنکرون.

        :param package_name: نام پکیج که می‌خواهید URL آن را دریافت کنید.
        :return: URL صفحه خانه پکیج.
        """
        package_info = await self.get_package_info(package_name)
        return {"home_page": package_info.get('info', {}).get('home_page', 'Homepage not available.')}

    async def get_first_release_date(self, package_name):
        """
        دریافت تاریخ اولین انتشار پکیج به صورت آسنکرون.

        :param package_name: نام پکیج که می‌خواهید تاریخ اولین انتشار آن را دریافت کنید.
        :return: تاریخ اولین انتشار پکیج.
        """
        package_info = await self.get_package_info(package_name)
        first_release = package_info.get('releases', {}).get('0.1', [])
        if first_release:
            first_release_date = first_release[0].get('upload_time')
            first_release_datetime = datetime.strptime(first_release_date, "%Y-%m-%dT%H:%M:%S")
            return {"first_release_date": first_release_datetime.strftime("%Y-%m-%d %H:%M:%S")}
        else:
            return {"first_release_date": "First release date not available."}

    async def check_package_status(self, package_name):
        """
        بررسی وضعیت موجودیت پکیج به صورت آسنکرون.

        :param package_name: نام پکیج که می‌خواهید وضعیت آن را بررسی کنید.
        :return: دیکشنری که شامل وضعیت موجودیت پکیج است.
        """
        try:
            await self.get_package_info(package_name)
            return {"status": True}
        except:
            return {"status": False}