"""
طراحی شده توسط محمد نورائی
تمامی حقوق محفوظ است (C) ۱۴۰۵ - تا پایان زمان

Written by Mohammad Nouraei.
CopyRight (C) 2026 - Until end of time
"""

from js import window, document, katex
from pyodide.ffi import to_js


def fmt(num):

    if isinstance(num, (int, float)):
        if float(num).is_integer():
            n = int(num)
            return f"({n})" if n < 0 else str(n)
        r = round(num, 4)
        return f"({r})" if r < 0 else str(r)
    return str(num)


identities = {
    'sq_bin_plus': {
        'vars': ['a', 'b'],
        'formula': r"(a + b)^2 = a^2 + 2ab + b^2",
        'calc': lambda v: (v['a'] + v['b']) ** 2,
        'steps': lambda v, res: [
            {"t": "۱. عبارت را به صورت ضرب دو پرانتز می‌نویسیم:", "m": r"(a+b)(a+b)"},
            {"t": "۲. هر جمله پرانتز اول را در تمام جملات پرانتز دوم ضرب می‌کنیم:", "m": r"a(a+b) + b(a+b)"},
            {"t": "۳. انجام ضرب‌های تک‌تک:", "m": r"a^2 + ab + ba + b^2"},
            {"t": "۴. چون ab با ba برابر است، آن‌ها را جمع می‌کنیم:", "m": r"a^2 + 2ab + b^2"},
            {"t": "۵. جایگذاری اعداد و محاسبه نهایی:", "m": rf"{fmt(v['a'])}^{{2}} + 2{fmt(v['a'])}{fmt(v['b'])} + {fmt(v['b'])}^{{2}} = {fmt(res)}"}
        ]
    },
    'sq_bin_minus': {
        'vars': ['a', 'b'],
        'formula': r"(a - b)^2 = a^2 - 2ab + b^2",
        'calc': lambda v: (v['a'] - v['b']) ** 2,
        'steps': lambda v, res: [
            {"t": "۱. عبارت را به صورت ضرب دو پرانتز می‌نویسیم:", "m": r"(a-b)(a-b)"},
            {"t": "۲. ضرب جملات پرانتز اول در پرانتز دوم:", "m": r"a(a-b) - b(a-b)"},
            {"t": "۳. انجام ضرب‌های تک‌تک:", "m": r"a^2 - ab - ba + b^2"},
            {"t": "۴. ساده‌سازی جملات متشابه (ab- و ba-):", "m": r"a^2 - 2ab + b^2"},
            {"t": "۵. جایگذاری اعداد و محاسبه نهایی:", "m": rf"{fmt(v['a'])}^{{2}} - 2{fmt(v['a'])}{fmt(v['b'])} + {fmt(v['b'])}^{{2}} = {fmt(res)}"}
        ]
    },
    'diff_sq': {
        'vars': ['a', 'b'],
        'formula': r"(a - b)(a + b) = a^2 - b^2",
        'calc': lambda v: (v['a'] - v['b']) * (v['a'] + v['b']),
        'steps': lambda v, res: [
            {"t": "۱. جملات را در هم ضرب می‌کنیم:", "m": r"a(a+b) - b(a+b)"},
            {"t": "۲. باز کردن عبارت:", "m": r"a^2 + ab - ba - b^2"},
            {"t": "۳. جملات مثبت ab و منفی ba یکدیگر را حذف می‌کنند:", "m": r"a^2 - b^2"},
            {"t": "۴. نتیجه نهایی با اعداد شما:", "m": rf"{fmt(v['a'])}^{{2}} - {fmt(v['b'])}^{{2}} = {fmt(res)}"}
        ]
    },
    'comm_term': {
        'vars': ['x', 'a', 'b'],
        'formula': r"(x + a)(x + b) = x^2 + (a+b)x + ab",
        'calc': lambda v: (v['x'] + v['a']) * (v['x'] + v['b']),
        'steps': lambda v, res: [
            {"t": "۱. ضرب جملات در یکدیگر:", "m": r"x(x+b) + a(x+b)"},
            {"t": "۲. باز کردن پرانتزها:", "m": r"x^2 + bx + ax + ab"},
            {"t": "۳. از x در دو جمله میانی فاکتور می‌گیریم:", "m": r"x^2 + (a+b)x + ab"},
            {"t": "۴. محاسبه با اعداد شما:", "m": rf"{fmt(v['x'])}^{{2}} + ({fmt(v['a'])}+{fmt(v['b'])}){fmt(v['x'])} + ({fmt(v['a'])}\times{fmt(v['b'])}) = {fmt(res)}"}
        ]
    },
    'sq_tri': {
        'vars': ['a', 'b', 'c'],
        'formula': r"(a + b + c)^2 = a^2 + b^2 + c^2 + 2ab + 2ac + 2bc",
        'calc': lambda v: (v['a'] + v['b'] + v['c']) ** 2,
        'steps': lambda v, res: [
            {"t": "۱. عبارت را در خودش ضرب می‌کنیم:", "m": r"(a+b+c)(a+b+c)"},
            {"t": "۲. ضرب هر جمله در تمام جملات پرانتز مقابل:", "m": r"a(a+b+c) + b(a+b+c) + c(a+b+c)"},
            {"t": "۳. ترکیب جملات مشابه (مثل ab و ba):", "m": r"a^2+b^2+c^2+2ab+2ac+2bc"},
            {"t": "۴. حاصل عددی:", "m": rf"({fmt(v['a'])}+{fmt(v['b'])}+{fmt(v['c'])})^{{2}} = {fmt(res)}"}
        ]
    },
    'cube_bin_plus': {
        'vars': ['a', 'b'],
        'formula': r"(a + b)^3 = a^3 + 3a^2b + 3ab^2 + b^3",
        'calc': lambda v: (v['a'] + v['b']) ** 3,
        'steps': lambda v, res: [
            {"t": "۱. مکعب را به صورت ضرب توان ۲ در توان ۱ می‌نویسیم:", "m": r"(a+b)^2 (a+b)"},
            {"t": "۲. ابتدا مربع دو جمله‌ای را باز می‌کنیم:", "m": r"(a^2 + 2ab + b^2)(a+b)"},
            {"t": "۳. حالا تمام جملات را در پرانتز (a+b) ضرب می‌کنیم:", "m": r"a^3 + a^2b + 2a^2b + 2ab^2 + ab^2 + b^3"},
            {"t": "۴. جمع‌بندی نهایی عبارات متشابه:", "m": r"a^3 + 3a^2b + 3ab^2 + b^3"},
            {"t": "۵. جایگذاری و حاصل عددی:", "m": rf"{fmt(v['a'])}^{{3}} + 3{fmt(v['a'])}^{{2}}{fmt(v['b'])} + 3{fmt(v['a'])}{fmt(v['b'])}^{{2}} + {fmt(v['b'])}^{{3}} = {fmt(res)}"}
        ]
    },
    'cube_bin_minus': {
        'vars': ['a', 'b'],
        'formula': r"(a - b)^3 = a^3 - 3a^2b + 3ab^2 - b^3",
        'calc': lambda v: (v['a'] - v['b']) ** 3,
        'steps': lambda v, res: [
            {"t": "۱. عبارت را به صورت ضرب توان ۲ در توان ۱ می‌نویسیم:", "m": r"(a-b)^2 (a-b)"},
            {"t": "۲. ابتدا مربع دو جمله‌ای تفاضل را باز می‌کنیم:", "m": r"(a^2 - 2ab + b^2)(a-b)"},
            {"t": "۳. ضرب تمام جملات در پرانتز دوم با رعایت علامت‌ها:", "m": r"a^3 - a^2b - 2a^2b + 2ab^2 + ab^2 - b^3"},
            {"t": "۴. جمع‌بندی نهایی عبارات متشابه:", "m": r"a^3 - 3a^2b + 3ab^2 - b^3"},
            {"t": "۵. جایگذاری و حاصل عددی:", "m": rf"{fmt(v['a'])}^{{3}} - 3{fmt(v['a'])}^{{2}}{fmt(v['b'])} + 3{fmt(v['a'])}{fmt(v['b'])}^{{2}} - {fmt(v['b'])}^{{3}} = {fmt(res)}"}
        ]
    },
    'sum_cubes': {
        'vars': ['a', 'b'],
        'formula': r"a^3 + b^3 = (a + b)(a^2 - ab + b^2)",
        'calc': lambda v: v['a'] ** 3 + v['b'] ** 3,
        'steps': lambda v, res: [
            {"t": "۱. ضرب پرانتز کوچک (لاغر) در پرانتز بزرگ (چاق):", "m": r"(a+b)(a^2 - ab + b^2)"},
            {"t": "۲. ضرب جملات a و b به صورت جداگانه در پرانتز دوم:", "m": r"a(a^2 - ab + b^2) + b(a^2 - ab + b^2)"},
            {"t": "۳. بسط عبارات:", "m": r"a^3 - a^2b + ab^2 + a^2b - ab^2 + b^3"},
            {"t": "۴. ساده‌سازی و حذف جملات قرینه (a²b- با a²b+ و ab² با ab²-):", "m": r"a^3 + b^3"},
            {"t": "۵. محاسبه عددی با اعداد شما:", "m": rf"{fmt(v['a'])}^{{3}} + {fmt(v['b'])}^{{3}} = ({fmt(v['a'])}+{fmt(v['b'])})({fmt(v['a'])}^{{2}} - {fmt(v['a'])}{fmt(v['b'])} + {fmt(v['b'])}^{{2}}) = {fmt(res)}"}
        ]
    },
    'diff_cubes': {
        'vars': ['a', 'b'],
        'formula': r"a^3 - b^3 = (a - b)(a^2 + ab + b^2)",
        'calc': lambda v: v['a'] ** 3 - v['b'] ** 3,
        'steps': lambda v, res: [
            {"t": "۱. ضرب پرانتز کوچک در پرانتز بزرگ:", "m": r"(a-b)(a^2 + ab + b^2)"},
            {"t": "۲. ضرب جملات a و b- به صورت جداگانه در پرانتز دوم:", "m": r"a(a^2 + ab + b^2) - b(a^2 + ab + b^2)"},
            {"t": "۳. بسط عبارات:", "m": r"a^3 + a^2b + ab^2 - a^2b - ab^2 - b^3"},
            {"t": "۴. ساده‌سازی و حذف جملات قرینه:", "m": r"a^3 - b^3"},
            {"t": "۵. محاسبه عددی با اعداد شما:", "m": rf"{fmt(v['a'])}^{{3}} - {fmt(v['b'])}^{{3}} = ({fmt(v['a'])}-{fmt(v['b'])})({fmt(v['a'])}^{{2}} + {fmt(v['a'])}{fmt(v['b'])} + {fmt(v['b'])}^{{2}}) = {fmt(res)}"}
        ]
    },
    'pow4_bin_plus': {
        'vars': ['a', 'b'],
        'formula': r"(a + b)^4 = a^4 + 4a^3b + 6a^2b^2 + 4ab^3 + b^4",
        'calc': lambda v: (v['a'] + v['b']) ** 4,
        'steps': lambda v, res: [
            {"t": "۱. عبارت را به صورت توان ۲ در توان ۲ می‌نویسیم:", "m": r"((a+b)^2)^2"},
            {"t": "۲. مربع دو جمله‌ای را باز می‌کنیم:", "m": r"(a^2 + 2ab + b^2)(a^2 + 2ab + b^2)"},
            {"t": "۳. ضرب جملات و ساده‌سازی عبارات متشابه با ضرایب مثلث پاسکال (۱, ۴, ۶, ۴, ۱):", "m": r"a^4 + 4a^3b + 6a^2b^2 + 4ab^3 + b^4"},
            {"t": "۴. جایگذاری اعداد و محاسبه نهایی:", "m": rf"{fmt(v['a'])}^{{4}} + 4{fmt(v['a'])}^{{3}}{fmt(v['b'])} + 6{fmt(v['a'])}^{{2}}{fmt(v['b'])}^{{2}} + 4{fmt(v['a'])}{fmt(v['b'])}^{{3}} + {fmt(v['b'])}^{{4}} = {fmt(res)}"}
        ]
    },
    'pow4_bin_minus': {
        'vars': ['a', 'b'],
        'formula': r"(a - b)^4 = a^4 - 4a^3b + 6a^2b^2 - 4ab^3 + b^4",
        'calc': lambda v: (v['a'] - v['b']) ** 4,
        'steps': lambda v, res: [
            {"t": "۱. عبارت را به صورت توان ۲ در توان ۲ می‌نویسیم:", "m": r"((a-b)^2)^2"},
            {"t": "۲. مربع تفاضل را باز می‌کنیم:", "m": r"(a^2 - 2ab + b^2)(a^2 - 2ab + b^2)"},
            {"t": "۳. اعمال علامت‌های متناوب با ضرایب مثلث پاسکال:", "m": r"a^4 - 4a^3b + 6a^2b^2 - 4ab^3 + b^4"},
            {"t": "۴. جایگذاری اعداد و محاسبه نهایی:", "m": rf"{fmt(v['a'])}^{{4}} - 4{fmt(v['a'])}^{{3}}{fmt(v['b'])} + 6{fmt(v['a'])}^{{2}}{fmt(v['b'])}^{{2}} - 4{fmt(v['a'])}{fmt(v['b'])}^{{3}} + {fmt(v['b'])}^{{4}} = {fmt(res)}"}
        ]
    },
    'euler': {
        'vars': ['a', 'b', 'c'],
        'formula': r"a^3 + b^3 + c^3 - 3abc = (a+b+c)(a^2+b^2+c^2-ab-bc-ca)",
        'calc': lambda v: v['a']**3 + v['b']**3 + v['c']**3 - 3*v['a']*v['b']*v['c'],
        'steps': lambda v, res: [
            {"t": "۱. تجزیه عبارت با استفاده از اتحاد اویلر:", "m": r"(a+b+c)(a^2 + b^2 + c^2 - ab - bc - ca)"},
            {"t": "۲. ضرب جملات پرانتز اول در پرانتز دوم و ساده‌سازی عبارات متشابه:", "m": r"a^3 + b^3 + c^3 - 3abc"},
            {"t": "۳. جایگذاری اعداد و محاسبه نهایی:", "m": rf"{fmt(v['a'])}^{{3}} + {fmt(v['b'])}^{{3}} + {fmt(v['c'])}^{{3}} - 3{fmt(v['a'])}{fmt(v['b'])}{fmt(v['c'])} = {fmt(res)}"}
        ]
    },
    'sophie_germain': {
        'vars': ['a', 'b'],
        'formula': r"a^4 + a^2b^2 + b^4 = (a^2 + ab + b^2)(a^2 - ab + b^2)",
        'calc': lambda v: v['a']**4 + (v['a']**2)*(v['b']**2) + v['b']**4,
        'steps': lambda v, res: [
            {"t": "۱. اضافه و کم کردن عبارت a²b² برای ساختن مربع کامل:", "m": r"(a^4 + 2a^2b^2 + b^4) - a^2b^2"},
            {"t": "۲. تبدیل به مربع دو جمله‌ای:", "m": r"(a^2 + b^2)^2 - (ab)^2"},
            {"t": "۳. استفاده از اتحاد مزدوج:", "m": r"(a^2 + b^2 - ab)(a^2 + b^2 + ab)"},
            {"t": "۴. جایگذاری اعداد و محاسبه نهایی:", "m": rf"({fmt(v['a'])}^{{2}} + {fmt(v['a'])}{fmt(v['b'])} + {fmt(v['b'])}^{{2}})({fmt(v['a'])}^{{2}} - {fmt(v['a'])}{fmt(v['b'])} + {fmt(v['b'])}^{{2}}) = {fmt(res)}"}
        ]
    },
    'lagrange': {
        'vars': ['a', 'b', 'x', 'y'],
        'formula': r"(a^2 + b^2)(x^2 + y^2) = (ax + by)^2 + (ay - bx)^2",
        'calc': lambda v: (v['a']**2 + v['b']**2) * (v['x']**2 + v['y']**2),
        'steps': lambda v, res: [
            {"t": "۱. باز کردن سمت چپ اتحاد (ضرب تک‌تک جملات):", "m": r"a^2x^2 + a^2y^2 + b^2x^2 + b^2y^2"},
            {"t": "۲. اضافه و کم کردن عبارت 2abxy به منظور مرتب‌سازی:", "m": r"(a^2x^2 + 2abxy + b^2y^2) + (a^2y^2 - 2abxy + b^2x^2)"},
            {"t": "۳. تبدیل به مجموع دو مربع کامل (اتحاد لاگرانژ):", "m": r"(ax + by)^2 + (ay - bx)^2"},
            {"t": "۴. جایگذاری اعداد و محاسبه نهایی:", "m": rf"({fmt(v['a'])}\times{fmt(v['x'])} + {fmt(v['b'])}\times{fmt(v['y'])})^{{2}} + ({fmt(v['a'])}\times{fmt(v['y'])} - {fmt(v['b'])}\times{fmt(v['x'])})^{{2}} = {fmt(res)}"}
        ]
    }
}


def updateInputs(*args):
    type_key = document.getElementById('identity-select').value
    container = document.getElementById('dynamic-inputs')
    formulaBox = document.getElementById('general-formula')

    container.innerHTML = ''
    iden = identities[type_key]

    for var in iden['vars']:
        group = document.createElement('div')
        group.className = 'input-group-item'
        group.innerHTML = f"<label style='font-weight:bold;'>{var}: </label><input type='number' id='input-{var}' value='2' style='width:55px;'>"
        container.appendChild(group)

    options = to_js({"displayMode": True}, dict_converter=window.Object.fromEntries)
    katex.render(iden['formula'], formulaBox, options)


def calculateIdentity(*args):
    type_key = document.getElementById('identity-select').value
    iden = identities[type_key]
    stepsContainer = document.getElementById('proof-steps')
    resultBanner = document.getElementById('numeric-result')

    stepsContainer.innerHTML = ''

    v = {}
    for var in iden['vars']:
        input_el = document.getElementById(f"input-{var}")
        try:
            val = float(input_el.value)
        except Exception:
            val = 0.0
        v[var] = val

    res = iden['calc'](v)
    steps = iden['steps'](v, res)

    options = to_js({"displayMode": True}, dict_converter=window.Object.fromEntries)

    for s in steps:
        wrap = document.createElement('div')
        wrap.className = 'step-item'

        title_div = document.createElement('div')
        title_div.className = 'step-text'
        title_div.innerText = s['t']

        math_div = document.createElement('div')
        math_div.className = 'math-box'

        wrap.appendChild(title_div)
        wrap.appendChild(math_div)
        stepsContainer.appendChild(wrap)

        katex.render(s['m'], math_div, options)

    resultBanner.innerText = f"حاصل عددی نهایی: {fmt(res)}"


window.updateInputs = updateInputs
window.calculateIdentity = calculateIdentity

updateInputs()