import tkinter as tk
from tkinter import ttk, messagebox
import json
import os
from datetime import datetime

# 数据文件
DATA_FILE = "vote_data.json"

class AdvancedVoteSystem:
    def __init__(self, root):
        self.root = root
        self.root.title("加强版投票调查系统 | 持久化+防重复投票")
        self.root.geometry("650x500")
        self.root.resizable(False, False)

        # 初始化数据
        self.init_data()

        # 页面标签
        self.notebook = ttk.Notebook(root)
        self.tab_vote = ttk.Frame(self.notebook)
        self.tab_survey = ttk.Frame(self.notebook)
        self.tab_log = ttk.Frame(self.notebook)

        self.notebook.add(self.tab_vote, text="🏆 正式投票")
        self.notebook.add(self.tab_survey, text="📋 问卷调查")
        self.notebook.add(self.tab_log, text="📄 投票日志")
        self.notebook.pack(expand=True, fill="both", padx=10, pady=10)

        # 构建页面
        self.build_vote_tab()
        self.build_survey_tab()
        self.build_log_tab()

    # 初始化/加载数据
    def init_data(self):
        if os.path.exists(DATA_FILE):
            with open(DATA_FILE, "r", encoding="utf-8") as f:
                data = json.load(f)
            self.candidates = data["candidates"]
            self.vote_count = data["vote_count"]
            self.voted_users = data["voted_users"]
            self.survey_options = data["survey_options"]
            self.survey_count = data["survey_count"]
            self.log_list = data["log_list"]
        else:
            # 初始默认数据
            self.candidates = ["张三", "李四", "王五", "赵六"]
            self.vote_count = {name: 0 for name in self.candidates}
            self.voted_users = []
            self.survey_options = ["学习氛围好", "老师负责", "设备完善", "食堂满意"]
            self.survey_count = {opt: 0 for opt in self.survey_options}
            self.log_list = []

        self.check_vars = [tk.BooleanVar() for _ in self.survey_options]

    # 保存所有数据
    def save_data(self):
        data = {
            "candidates": self.candidates,
            "vote_count": self.vote_count,
            "voted_users": self.voted_users,
            "survey_options": self.survey_options,
            "survey_count": self.survey_count,
            "log_list": self.log_list
        }
        with open(DATA_FILE, "w", encoding="utf-8") as f:
            json.dump(data, f, ensure_ascii=False, indent=4)

    # ====================== 投票页面 ======================
    def build_vote_tab(self):
        tk.Label(self.tab_vote, text="班级干部正式投票", font=("微软雅黑", 18, "bold")).pack(pady=10)
        tk.Label(self.tab_vote, text="每人仅限一票，重复投票系统自动拦截", font=("微软雅黑", 10), fg="red").pack()

        self.vote_var = tk.StringVar()
        self.vote_var.set("")

        frame = tk.Frame(self.tab_vote)
        frame.pack(pady=15)
        for idx, name in enumerate(self.candidates):
            ttk.Radiobutton(frame, text=name, variable=self.vote_var, value=name).grid(row=idx, column=0, pady=4, sticky="w")

        # 用户输入模拟编号（防重复）
        tk.Label(self.tab_vote, text="请输入你的投票编号(任意唯一数字):", font=("微软雅黑", 11)).pack()
        self.user_id = tk.Entry(self.tab_vote, width=30, font=("微软雅黑", 11))
        self.user_id.pack(pady=5)

        # 结果展示
        self.vote_text = tk.Text(self.tab_vote, width=70, height=8, font=("微软雅黑", 10))
        self.vote_text.pack(pady=10)
        self.refresh_vote_result()

        # 按钮
        bf = tk.Frame(self.tab_vote)
        bf.pack(pady=5)
        ttk.Button(bf, text="提交投票", command=self.submit_vote).grid(row=0, column=0, padx=10)
        ttk.Button(bf, text="刷新数据", command=self.refresh_vote_result).grid(row=0, column=1, padx=10)

    def submit_vote(self):
        uid = self.user_id.get().strip()
        select = self.vote_var.get().strip()

        if not uid:
            messagebox.showwarning("提示", "请输入投票编号！")
            return
        if not select:
            messagebox.showwarning("提示", "请选择候选人！")
        if uid in self.voted_users:
            messagebox.showerror("禁止操作", "该编号已投过票，禁止重复投票！")
            return

        # 计数+1
        self.vote_count[select] += 1
        self.voted_users.append(uid)

        # 写入日志
        now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        self.log_list.append({
            "time": now,
            "type": "正式投票",
            "user": uid,
            "choose": select
        })

        self.save_data()
        self.refresh_vote_result()
        messagebox.showinfo("投票成功", f"成功为【{select}】投票！")
        self.user_id.delete(0, tk.END)

    def refresh_vote_result(self):
        self.vote_text.delete(1.0, tk.END)
        total = sum(self.vote_count.values())
        res = "===== 实时投票统计（含占比）=====\n"
        for name, cnt in self.vote_count.items():
            percent = (cnt / total * 100) if total > 0 else 0.0
            res += f"{name}：{cnt} 票  占比 {percent:.2f}%\n"
        res += f"\n总投票人数：{total} 人 | 已禁止重复投票"
        self.vote_text.insert(1.0, res)

    # ====================== 问卷调查页面 ======================
    def build_survey_tab(self):
        tk.Label(self.tab_survey, text="校园满意度问卷调查（多选）", font=("微软雅黑", 18, "bold")).pack(pady=10)

        frame = tk.Frame(self.tab_survey)
        frame.pack(pady=10)

        for idx, opt in enumerate(self.survey_options):
            ttk.Checkbutton(frame, text=opt, variable=self.check_vars[idx]).grid(row=idx, column=0, pady=3, sticky="w")

        self.survey_text = tk.Text(self.tab_survey, width=70, height=8, font=("微软雅黑", 10))
        self.survey_text.pack(pady=10)
        self.refresh_survey_result()

        bf = tk.Frame(self.tab_survey)
        bf.pack()
        ttk.Button(bf, text="提交问卷", command=self.submit_survey).grid(row=0, column=0, padx=10)
        ttk.Button(bf, text="刷新统计", command=self.refresh_survey_result).grid(row=0, column=1, padx=10)

    def submit_survey(self):
        choose_list = []
        for idx, var in enumerate(self.check_vars):
            if var.get():
                choose_list.append(self.survey_options[idx])
                self.survey_count[self.survey_options[idx]] += 1

        if not choose_list:
            messagebox.showwarning("提示", "至少选择一项！")
            return

        # 日志记录
        now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        self.log_list.append({
            "time": now,
            "type": "问卷调查",
            "user": "匿名",
            "choose": ",".join(choose_list)
        })

        # 清空选择
        for var in self.check_vars:
            var.set(False)

        self.save_data()
        self.refresh_survey_result()
        messagebox.showinfo("提交成功", f"问卷提交完成！\n本次选择：{'、'.join(choose_list)}")

    def refresh_survey_result(self):
        self.survey_text.delete(1.0, tk.END)
        total = sum(self.survey_count.values())
        res = "===== 问卷统计结果 =====\n"
        for opt, cnt in self.survey_count.items():
            percent = (cnt / total * 100) if total > 0 else 0.0
            res += f"{opt}：{cnt} 人次  占比 {percent:.2f}%\n"
        self.survey_text.insert(1.0, res)

    # ====================== 日志页面 ======================
    def build_log_tab(self):
        tk.Label(self.tab_log, text="全部投票记录日志", font=("微软雅黑", 18, "bold")).pack(pady=10)
        self.log_text = tk.Text(self.tab_log, width=80, height=18, font=("微软雅黑", 9))
        self.log_text.pack()
        ttk.Button(self.tab_log, text="刷新日志", command=self.refresh_log).pack(pady=5)
        ttk.Button(self.tab_log, text="清空所有数据", command=self.clear_all).pack(pady=5)
        self.refresh_log()

    def refresh_log(self):
        self.log_text.delete(1.0, tk.END)
        if not self.log_list:
            self.log_text.insert(1.0, "暂无投票记录")
            return
        for idx, log in enumerate(self.log_list, 1):
            line = f"{idx}. [{log['time']}] {log['type']} | 用户:{log['user']} | 选择:{log['choose']}\n"
            self.log_text.insert(tk.END, line)

    def clear_all(self):
        if not messagebox.askyesno("确认", "确定要清空所有投票数据和日志吗？不可恢复！"):
            return
        # 重置所有
        self.vote_count = {name:0 for name in self.candidates}
        self.voted_users.clear()
        self.survey_count = {opt:0 for opt in self.survey_options}
        self.log_list.clear()
        self.save_data()
        self.refresh_vote_result()
        self.refresh_survey_result()
        self.refresh_log()
        messagebox.showinfo("完成", "所有数据已清空！")

if __name__ == "__main__":
    root = tk.Tk()
    app = AdvancedVoteSystem(root)
    root.mainloop()
