import requests
import pyttsx3
import json


class AirQualityData:
    def __init__(self, city="tehran"):
        self.input_city = city.lower()
        self.data = None
        self.raw_data = None
        self._fetch_data()

    def _fetch_data(self):
        """Fetch data from API (دریافت اطلاعات از API)"""
        try:
            url = f"http://api.waqi.info/feed/{self.input_city}/?token=a77ec062d00fbba59f2107ba7e85848113d7447e"
            response = requests.get(url).json()
            self.raw_data = response  # ذخیره پاسخ کامل دریافتی از API
            if response.get("status") == "ok":
                self.data = {
                    "city": response['data']['city']['name'],
                    "aqi": response['data']['aqi'],
                    "temperature": response['data']['iaqi'].get('t', {}).get('v', 'N/A'),
                    "humidity": response['data']['iaqi'].get('h', {}).get('v', 'N/A'),
                    "air_pollution_level": self.air_pollution_level(response['data']['aqi'])
                }
            else:
                print("Invalid city name or data not available. (❌ نام شهر نامعتبر است یا داده‌ای موجود نیست.)")
                self.data = None
        except Exception:
            print("Error fetching data. Please try again. (❌ خطا در دریافت اطلاعات. لطفاً دوباره تلاش کنید.)")
            self.data = None

    def air_pollution_level(self, aqi):
        """Determine air quality based on AQI (تعیین کیفیت هوا براساس مقدار AQI)"""
        try:
            aqi = int(aqi)
        except:
            return "Unknown"
        if 0 <= aqi <= 50:
            return 'Good (خوب)'
        elif 51 <= aqi <= 100:
            return 'Moderate (متوسط)'
        elif 101 <= aqi <= 150:
            return 'Unhealthy for Sensitive Groups (ناسالم برای گروه‌های حساس)'
        elif 151 <= aqi <= 200:
            return 'Unhealthy (ناسالم)'
        elif 201 <= aqi <= 300:
            return 'Very Unhealthy (خیلی ناسالم)'
        else:
            return 'Hazardous (خطرناک)'

    def get_full_info(self):
        return self.data

    def get_aqi_info(self):
        return f"AQI: {self.data['aqi']} ({self.data['air_pollution_level']})" if self.data else "No data available"

    def get_temperature_info(self):
        return f"Temperature: {self.data['temperature']}°C (دما)" if self.data else "No data available"

    def get_humidity_info(self):
        return f"Humidity: {self.data['humidity']}% (رطوبت)" if self.data else "No data available"

    def speak_info(self):
        """Speak information (پخش اطلاعات به صورت صوتی)"""
        if not self.data:
            print("No data available to speak. (❌ داده‌ای موجود نیست.)")
            return
        engine = pyttsx3.init()
        engine.setProperty('rate', 120)
        message = (f"The AQI in {self.data['city']} is {self.data['aqi']} quality {self.data['air_pollution_level']}. "
                   f"The temperature is {self.data['temperature']} degrees Celsius and the humidity is {self.data['humidity']} percent.")
        engine.say(message)
        print(message)
        engine.runAndWait()

    def print_formatted_info(self, info_type):
        """Print formatted information with emojis (چاپ اطلاعات به صورت زیبا همراه با ایموجی)"""
        if info_type == "full":
            info = self.get_full_info()
            if info is not None:
                print("===================================")
                print(f"🌍 City: {info['city']} (شهر)")
                print(f"💨 AQI: {info['aqi']} ({info['air_pollution_level']})")
                print(f"🌡 Temperature: {info['temperature']}°C (دما)")
                print(f"💧 Humidity: {info['humidity']}% (رطوبت)")
                print("===================================")
            else:
                print("No data available. (❌ داده‌ای موجود نیست.)")
        elif info_type == "aqi":
            print(f"💨 {self.get_aqi_info()}")
        elif info_type == "temperature":
            print(f"🌡 {self.get_temperature_info()}")
        elif info_type == "humidity":
            print(f"💧 {self.get_humidity_info()}")
        else:
            print("Invalid information type (❌ نوع اطلاعات نامعتبر است.)")

    def get_show_all_json_data(self):
        if self.raw_data:
            return json.dumps(self.raw_data, indent=4, ensure_ascii=False)
        else:
            return ("No raw data available. (❌ داده خام موجود نیست.)")

    def print_show_all_json_data(self):
        if self.raw_data:
            print("===== Raw API Data =====")
            print(json.dumps(self.raw_data, indent=4, ensure_ascii=False))
            print("========================")
        else:
            print("No raw data available. (❌ داده خام موجود نیست.)")
# hellooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
    def p(self, info_type):
        """Print formatted information with emojis (چاپ اطلاعات به صورت زیبا همراه با ایموجی)"""
        if info_type == "full":
            info = self.get_full_info()
            if info is not None:
                print("===================================")
                print(f"🌍 City: {info['city']} (شهر)")
                print(f"💨 AQI: {info['aqi']} ({info['air_pollution_level']})")
                print(f"🌡 Temperature: {info['temperature']}°C (دما)")
                print(f"💧 Humidity: {info['humidity']}% (رطوبت)")
                print("===================================")
            else:
                print("No data available. (❌ داده‌ای موجود نیست.)")
        elif info_type == "aqi":
            info = self.get_aqi_info()
            print(f"💨 {info}")
        elif info_type == "temperature":
            info = self.get_temperature_info()
            print(f"🌡 {info}")
        elif info_type == "humidity":
            info = self.get_humidity_info()
            print(f"💧 {info}")
        else:
            print("Invalid information type (❌ نوع اطلاعات نامعتبر است.)")

    def r(self, info_type):
        return self._get_info_by_type(info_type)

    def pr(self, info_type):
        info = self._get_info_by_type(info_type)
        print(info)
        return info


    def _get_info_by_type(self, info_type):
        if info_type == "full":
            return self.get_full_info()
        elif info_type == "aqi":
            return self.get_aqi_info()
        elif info_type == "temperature":
            return self.get_temperature_info()
        elif info_type == "humidity":
            return self.get_humidity_info()
        elif info_type == "json":
            return self.get_show_all_json_data()
        else:
            return "Invalid information type (❌ نوع اطلاعات نامعتبر است.)"

# ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd


def terminal_mode():
    # لیست پیش‌فرض شهرها جهت سهولت انتخاب
    city_list = {
        "1": "tehran",
        "2": "varamin",
        "3": "mashhad",
        "4": "esfahan",
        "5": "shiraz",
        "6": "tabriz",
        "7": "karaj",
        "8": "rasht",
        "9": "ahvaz",
        "10": "bushehr"
    }
    print("City List: (📌 لیست شهرها)")
    for key, city in city_list.items():
        print(f"{key}. {city.capitalize()}")
    city_choice = input("Enter city number or city name: (🔹 شماره شهر یا نام شهر را وارد کنید) : ").strip()


    # اگر ورودی در لیست موجود باشد، از آن استفاده می‌کنیم، در غیر این صورت ورودی کاربر به عنوان نام شهر در نظر گرفته می‌شود.
    if city_choice in city_list:
        city = city_list[city_choice]
    else:
        city = city_choice

    aq = AirQualityData(city)
    if aq.data is None:
        print("Failed to retrieve data for the city. Exiting terminal mode. (❌ دریافت داده با مشکل مواجه شد.)")
        return

    while True:
        print("\nChoose an option: (✅ انتخاب کنید) : ")
        print("1. Get full information (دریافت اطلاعات کامل)")
        print("2. Get AQI (دریافت AQI)")
        print("3. Get temperature (دریافت دما)")
        print("4. Get humidity (دریافت رطوبت)")
        print("5. Audio output (خروجی صوتی)")
        print("6. Show all json data  (نمایش تمام داده‌های دریافتی  جیسون )")
        print("7. Change city (تغییر شهر)")
        print("0. Exit (خروج)")

        choice = input("Enter option: (🔹 گزینه را وارد کنید:) ").strip()
        print('\n  ')
        if choice == "1":
            aq.print_formatted_info("full")
        elif choice == "2":
            aq.print_formatted_info("aqi")
        elif choice == "3":
            aq.print_formatted_info("temperature")
        elif choice == "4":
            aq.print_formatted_info("humidity")
        elif choice == "5":
            aq.speak_info()
        elif choice == "6":
            aq.print_show_all_json_data()
        elif choice == "7":
            return terminal_mode()
        elif choice == "0":
            print("Goodbye! (👋 خداحافظ!)")
            break
        else:
            print("Invalid option. Try again. (❌ گزینه نامعتبر. دوباره امتحان کنید.)")



