import random
from fractions import Fraction
from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes
from dotenv import load_dotenv
import os
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
from PIL import Image

# بارگذاری متغیرهای محیطی از فایل .env
load_dotenv()

# بارگذاری فونت فارسی
def load_persian_font():
    return fm.FontProperties(fname='/root/math/fonts/NotoNaskhArabic-VariableFont_wght.ttf')

def convert_to_persian_numerals(number):
    """تبدیل اعداد انگلیسی به اعداد فارسی."""
    persian_numerals = '۰۱۲۳۴۵۶۷۸۹'
    return ''.join(persian_numerals[int(digit)] for digit in str(number))

def generate_fraction():
    """تولید یک کسر تصادفی با صورت کوچکتر از مخرج."""
    while True:
        numerator = random.randint(1, 10)
        denominator = random.randint(1, 10)
        if numerator < denominator:
            return Fraction(numerator, denominator)

def generate_addition_problem():
    """تولید دو کسر تصادفی."""
    fraction1 = generate_fraction()
    fraction2 = generate_fraction()
    return fraction1, fraction2

def create_fraction_image(fraction1, fraction2):
    """ایجاد تصویر برای دو کسر با حروف فارسی."""
    fig, ax = plt.subplots(figsize=(5, 3))  # افزایش ابعاد برای فضای بیشتر
    font = load_persian_font()

    # نمایش کسر اول
    ax.text(0.25, 0.6, convert_to_persian_numerals(fraction1.numerator), fontsize=24, ha='center', fontproperties=font)
    ax.text(0.25, 0.4, convert_to_persian_numerals(fraction1.denominator), fontsize=24, ha='center', fontproperties=font)
    ax.text(0.25, 0.5, '−' * max(len(str(fraction1.numerator)), len(str(fraction1.denominator))), fontsize=24, ha='center', fontproperties=font)

    # نمایش کسر دوم
    ax.text(0.75, 0.6, convert_to_persian_numerals(fraction2.numerator), fontsize=24, ha='center', fontproperties=font)
    ax.text(0.75, 0.4, convert_to_persian_numerals(fraction2.denominator), fontsize=24, ha='center', fontproperties=font)
    ax.text(0.75, 0.5, '−' * max(len(str(fraction2.numerator)), len(str(fraction2.denominator))), fontsize=24, ha='center', fontproperties=font)

    # نمایش علامت جمع
    ax.text(0.5, 0.5, '+', fontsize=24, ha='center', fontproperties=font)

    ax.axis('off')

    # ذخیره تصویر به صورت PNG
    image_path = "fractions_plot.png"
    plt.savefig(image_path, bbox_inches='tight', dpi=100)
    plt.close()

    # فشرده‌سازی تصویر
    compress_image(image_path)

    return image_path

def create_answer_image(fraction1, fraction2):
    """ایجاد تصویر برای کسرها و جواب آنها."""
    fig, ax = plt.subplots(figsize=(4, 3))
    font = load_persian_font()

    # محاسبه جواب
    answer = fraction1 + fraction2
    answer_numerator = answer.numerator
    answer_denominator = answer.denominator

    # نمایش کسر اول
    ax.text(0.1, 0.65, convert_to_persian_numerals(fraction1.numerator), fontsize=24, ha='center', fontproperties=font)
    ax.text(0.1, 0.475, convert_to_persian_numerals(fraction1.denominator), fontsize=24, ha='center', fontproperties=font)
    ax.text(0.1, 0.55, '−' * max(len(str(fraction1.numerator)), len(str(fraction1.denominator))), fontsize=24, ha='center', fontproperties=font)

    # نمایش علامت جمع نزدیک به کسر اول
    ax.text(0.3, 0.55, '+', fontsize=24, ha='center', fontproperties=font)

    # نمایش کسر دوم
    ax.text(0.5, 0.65, convert_to_persian_numerals(fraction2.numerator), fontsize=24, ha='center', fontproperties=font)
    ax.text(0.5, 0.475, convert_to_persian_numerals(fraction2.denominator), fontsize=24, ha='center', fontproperties=font)
    ax.text(0.5, 0.55, '−' * max(len(str(fraction2.numerator)), len(str(fraction2.denominator))), fontsize=24, ha='center', fontproperties=font)

    # نمایش علامت مساوی و جواب کنار کسر دوم
    ax.text(0.7, 0.55, '=', fontsize=24, ha='center', fontproperties=font)
    ax.text(0.8, 0.65, convert_to_persian_numerals(answer_numerator), fontsize=24, ha='center', fontproperties=font)
    ax.text(0.8, 0.475, convert_to_persian_numerals(answer_denominator), fontsize=24, ha='center', fontproperties=font)
    ax.text(0.8, 0.55, '−' * max(len(str(answer_numerator)), len(str(answer_denominator))), fontsize=24, ha='center', fontproperties=font)

    ax.axis('off')

    # ذخیره تصویر به صورت PNG
    image_path = "answer_plot.png"
    plt.savefig(image_path, bbox_inches='tight', dpi=100)
    plt.close()

    # فشرده‌سازی تصویر
    compress_image(image_path)

    return image_path

def compress_image(image_path):
    """فشرده‌سازی تصویر برای کاهش حجم آن."""
    img = Image.open(image_path)

    # تغییر حالت تصویر به RGB برای JPEG
    if img.mode in ("RGBA", "P"):  # اگر حالت RGBA یا P باشد
        img = img.convert("RGB")

    img.save(image_path, format='JPEG', quality=85)  # استفاده از JPEG و تنظیم کیفیت

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    await update.message.reply_text('سلام! برای دریافت سوال جمع کسرها، از دستور /add استفاده کنید.')

async def add(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    fraction1, fraction2 = generate_addition_problem()

    # ایجاد تصویر برای کسرها
    question_image_path = create_fraction_image(fraction1, fraction2)

    # ارسال تصویر سوال به تلگرام
    await update.message.reply_photo(photo=open(question_image_path, 'rb'))

    # ایجاد تصویر برای جواب
    answer_image_path = create_answer_image(fraction1, fraction2)

    # ارسال تصویر جواب به تلگرام
    await update.message.reply_photo(photo=open(answer_image_path, 'rb'))

def main():
    token = os.getenv("TELEGRAM_BOT_TOKEN")
    if not token:
        raise ValueError("No token found. Please set the TELEGRAM_BOT_TOKEN environment variable.")

    application = ApplicationBuilder().token(token).build()
    
    application.add_handler(CommandHandler("start", start))
    application.add_handler(CommandHandler("add", add))
    
    application.run_polling()

if __name__ == '__main__':
    main() می خواهم سوال فقط شامل جمع دو کسری باشد که مخرچ هایشان برابر است