import itertools
from js import renderMath
from pyscript import document


def get_set(input_id):
    raw_val = document.getElementById(input_id).value
    if not raw_val.strip():
        return set()
    return set(item.strip() for item in raw_val.split(",") if item.strip())


def to_latex(s):
    if not s:
        return r"\emptyset"
    sorted_elements = sorted(list(s), key=str)
    return r"\{ " + ", ".join(sorted_elements) + r" \}"


def cartesian_latex(A, B):
    if not A or not B:
        return r"\emptyset"
    pairs = []
    for a in sorted(map(str, A)):
        for b in sorted(map(str, B)):
            pairs.append(rf"({a}, {b})")
    return r"\{ " + ", ".join(pairs) + r" \}"


def powerset_latex(s):
    s_list = list(s)
    subsets = []
    for r in range(len(s_list) + 1):
        for combo in itertools.combinations(s_list, r):
            subsets.append(set(combo))

    latex_subsets = [to_latex(sub) for sub in subsets]
    return r"\{ " + ", ".join(latex_subsets) + r" \}"


def calculate(event):
    A = get_set("setA")
    B = get_set("setB")
    U = get_set("setU")

    u_card_str = rf"|U| = {len(U)}" if U else r"|U| = \text{?}"
    renderMath(
        "res-card", rf"|A| = {len(A)}, \quad |B| = {len(B)}, \quad {u_card_str}"
    )

    if A == B:
        renderMath("res-eq", r"A = B \quad \text{(برابر هستند)}")
    else:
        renderMath("res-eq", r"A \neq B \quad \text{(برابر نیستند)}")

    subset_str_a = r"\subseteq" if A.issubset(B) else r"\not\subseteq"
    proper_str_a = r"\subset" if A.issubset(B) and A != B else r"\not\subset"

    subset_str_b = r"\subseteq" if B.issubset(A) else r"\not\subseteq"
    proper_str_b = r"\subset" if B.issubset(A) and A != B else r"\not\subset"

    renderMath(
        "res-subset",
        rf"A {subset_str_a} B, \quad A {proper_str_a} B \quad \Bigg| \quad B {subset_str_b} A, \quad B {proper_str_b} A",
    )

    renderMath("res-union", rf"A \cup B = {to_latex(A | B)}")

    intersection = A & B
    renderMath("res-intersect", rf"A \cap B = {to_latex(intersection)}")

    badge = document.getElementById("badge-disjoint")
    if len(intersection) == 0 and len(A) > 0 and len(B) > 0:
        badge.innerText = "(مجموعه‌های مجزا)"
    else:
        badge.innerText = ""

    renderMath("res-diff-ab", rf"A \setminus B = {to_latex(A - B)}")
    renderMath("res-diff-ba", rf"B \setminus A = {to_latex(B - A)}")

    renderMath("res-symdiff", rf"A \triangle B = {to_latex(A ^ B)}")

    if U:
        renderMath("res-comp-a", rf"A' = {to_latex(U - A)}")
        renderMath("res-comp-b", rf"B' = {to_latex(U - B)}")
    else:
        renderMath("res-comp-a", r"A' = \text{(نیاز به مجموعه مرجع U)}")
        renderMath("res-comp-b", r"B' = \text{(نیاز به مجموعه مرجع U)}")

    renderMath("res-cartesian", rf"A \times B = {cartesian_latex(A, B)}")

    renderMath("res-pow-a", rf"\mathcal{{P}}(A) = {powerset_latex(A)}")
    renderMath("res-pow-b", rf"\mathcal{{P}}(B) = {powerset_latex(B)}")

    document.getElementById("results-section").style.display = "block"


document.getElementById("btn-calc").removeAttribute("disabled")
document.getElementById("loading-pyscript").style.display = "none"