File size: 5,281 Bytes
86725d8
3ee5dd7
 
0ab7867
86725d8
 
 
 
 
 
 
 
0ab7867
86725d8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0ab7867
 
 
86725d8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0ab7867
86725d8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0ab7867
86725d8
 
 
 
 
 
3d2ee11
86725d8
 
 
 
 
3d2ee11
3ee5dd7
 
3d2ee11
3ee5dd7
 
 
 
 
3d2ee11
 
 
86725d8
3ee5dd7
 
86725d8
 
 
 
 
0ab7867
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# teacher_panel.py
from typing import List, Tuple

import gradio as gr  # needed for gr.SelectData type

import qa_store
from qa_store import normalize_question
from loader import (
    generate_new_manual_id,
    save_manual_qa_file,
    rebuild_combined_qa,
    manual_qa_table_data,
    sync_upload_manual_qa,  # <--- IMPORT THE NEW FUNCTION
)


def _table() -> List[List[str]]:
    return manual_qa_table_data()


def teacher_save_add_overwrite(
    question: str, answer: str, current_id: str
) -> Tuple[str, str, str, List[List[str]], str]:
    """
    Add a new manual Q&A or overwrite existing one
    with the same normalized question.
    """
    question = (question or "").strip()
    answer = (answer or "").strip()
    current_id = current_id or ""

    if not question or not answer:
        msg = "❌ ກະລຸນາໃສ່ທັງຄໍາຖາມແລະຄໍາຕອບ."
        return question, answer, current_id, _table(), msg

    norm_q = normalize_question(question)
    entry = qa_store.MANUAL_QA_INDEX.get(norm_q)

    if entry:
        # overwrite existing manual Q&A
        entry["q"] = question
        entry["a"] = answer
        entry["norm_q"] = norm_q
        current_id = entry["id"]
        msg = "✅ ອັບເດດ Q&A ທີ່ມີຢູ່ແລ້ວ."
    else:
        # create new entry
        new_id = generate_new_manual_id()
        entry = {
            "id": new_id,
            "q": question,
            "a": answer,
            "norm_q": norm_q,
        }
        qa_store.MANUAL_QA_LIST.append(entry)
        qa_store.MANUAL_QA_INDEX[norm_q] = entry
        current_id = new_id
        msg = "✅ ບັນທຶກ Q&A ໃໝ່ສໍາເລັດ."

    save_manual_qa_file()     # 1. Save locally
    rebuild_combined_qa()     # 2. Update memory
    sync_upload_manual_qa()   # 3. Upload to Cloud (NEW)

    return question, answer, current_id, _table(), msg


def teacher_update_current(
    question: str, answer: str, current_id: str
) -> Tuple[str, str, str, List[List[str]], str]:
    """
    Update the currently selected manual Q&A by id.
    """
    question = (question or "").strip()
    answer = (answer or "").strip()
    current_id = current_id or ""

    if not current_id:
        msg = "❌ ກະລຸນາເລືອກ Q&A ຈາກຕາຕະລາງກ່ອນ."
        return question, answer, current_id, _table(), msg

    if not question or not answer:
        msg = "❌ ກະລຸນາໃສ່ທັງຄໍາຖາມແລະຄໍາຕອບ."
        return question, answer, current_id, _table(), msg

    entry = next((e for e in qa_store.MANUAL_QA_LIST if e["id"] == current_id), None)
    if not entry:
        msg = "⚠️ ບໍ່ພົບ Q&A ທີ່ເລືອກ."
        current_id = ""
        return question, answer, current_id, _table(), msg

    # remove old index
    qa_store.MANUAL_QA_INDEX.pop(entry["norm_q"], None)

    new_norm = normalize_question(question)
    entry["q"] = question
    entry["a"] = answer
    entry["norm_q"] = new_norm
    qa_store.MANUAL_QA_INDEX[new_norm] = entry

    save_manual_qa_file()
    rebuild_combined_qa()
    sync_upload_manual_qa()   # <--- Upload to Cloud (NEW)

    msg = "✅ ແກ້ໄຂ Q&A ສໍາເລັດ."
    return question, answer, current_id, _table(), msg


def teacher_delete_current(
    current_id: str,
) -> Tuple[str, str, str, List[List[str]], str]:
    """
    Delete the currently selected manual Q&A.
    """
    current_id = current_id or ""

    if not current_id:
        msg = "❌ ກະລຸນາເລືອກ Q&A ກ່ອນຈະລຶບ."
        return "", "", current_id, _table(), msg

    entry = next((e for e in qa_store.MANUAL_QA_LIST if e["id"] == current_id), None)
    if not entry:
        msg = "⚠️ ບໍ່ພົບ Q&A ທີ່ຈະລຶບ."
        return "", "", "", _table(), msg

    qa_store.MANUAL_QA_LIST = [e for e in qa_store.MANUAL_QA_LIST if e["id"] != current_id]
    qa_store.MANUAL_QA_INDEX.pop(entry["norm_q"], None)

    save_manual_qa_file()
    rebuild_combined_qa()
    sync_upload_manual_qa()   # <--- Upload to Cloud (NEW)

    msg = "🗑️ ລຶບ Q&A ສໍາເລັດ."
    return "", "", "", _table(), msg


def teacher_on_table_select(
    evt: gr.SelectData,
) -> Tuple[str, str, str, str]:
    """
    When teacher clicks a row in the Q&A table, load Q/A into textboxes.
    """
    try:
        if evt is None or evt.index is None or evt.row_value is None:
            raise ValueError("Empty select event")

        row = list(evt.row_value)

        current_id = str(row[0]) if len(row) > 0 else ""
        question = str(row[1]) if len(row) > 1 else ""
        answer = str(row[2]) if len(row) > 2 else ""

        if not current_id:
            raise ValueError("Empty ID from selected row")

        msg = f"✏️ ເລືອກ Q&A ID {current_id} ສໍາລັບແກ້ໄຂ."
    except Exception as e:  # noqa: BLE001
        print(f"[WARN] teacher_on_table_select error: {e}")
        current_id = ""
        question = ""
        answer = ""
        msg = "⚠️ ບໍ່ສາມາດເລືອກແຖວໄດ້."

    return question, answer, current_id, msg