import tkinter as tk
from tkinter import ttk, messagebox, simpledialog
import random
from datetime import datetime


class SurveySystem:
    def __init__(self, root):
        self.root = root
        self.root.title("📊 模拟投票 / 调查系统")
        self.root.geometry("750x600")
        self.root.resizable(False, False)

        # 数据存储
        self.surveys = {}  # {标题: {"options": [选项], "votes": {选项: 票数}, "voters": set(), "created": 时间}}
        self.current_user = "用户_" + str(random.randint(1000, 9999))
        self.current_survey = None

        self.build_ui()

    def build_ui(self):
        # 顶部信息栏
        top_frame = tk.Frame(self.root, padx=10, pady=8, bg="#2196F3")
        top_frame.pack(fill=tk.X)

        tk.Label(top_frame, text="📊 模拟投票 / 调查系统", font=("微软雅黑", 14, "bold"),
                 bg="#2196F3", fg="white").pack(side=tk.LEFT)
        tk.Label(top_frame, text=f"当前用户: {self.current_user}", font=("微软雅黑", 10),
                 bg="#2196F3", fg="white").pack(side=tk.RIGHT)

        # 主区域 - 左右分栏
        main_frame = tk.Frame(self.root)
        main_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)

        # 左侧：调查列表
        left_frame = tk.LabelFrame(main_frame, text="调查列表", font=("微软雅黑", 10, "bold"), padx=5, pady=5)
        left_frame.pack(side=tk.LEFT, fill=tk.Y, padx=(0, 5))

        self.survey_listbox = tk.Listbox(left_frame, width=25, height=22, font=("微软雅黑", 10),
                                         selectmode=tk.SINGLE)
        self.survey_listbox.pack(fill=tk.BOTH, expand=True)
        self.survey_listbox.bind("<<ListboxSelect>>", self.on_select_survey)

        list_btn_frame = tk.Frame(left_frame)
        list_btn_frame.pack(fill=tk.X, pady=5)

        tk.Button(list_btn_frame, text="➕ 新建调查", font=("微软雅黑", 9),
                  command=self.create_survey, bg="#4CAF50", fg="white").pack(side=tk.LEFT, padx=2)
        tk.Button(list_btn_frame, text="🗑️ 删除", font=("微软雅黑", 9),
                  command=self.delete_survey, bg="#F44336", fg="white").pack(side=tk.LEFT, padx=2)

        # 右侧：调查详情
        right_frame = tk.LabelFrame(main_frame, text="调查详情", font=("微软雅黑", 10, "bold"), padx=10, pady=10)
        right_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)

        self.detail_frame = tk.Frame(right_frame)
        self.detail_frame.pack(fill=tk.BOTH, expand=True)

        # 欢迎提示
        self.welcome_label = tk.Label(self.detail_frame,
                                      text="👈 请从左侧选择一个调查\n\n或点击「新建调查」创建一个",
                                      font=("微软雅黑", 12), fg="#999", justify=tk.CENTER)
        self.welcome_label.pack(expand=True)

        # 底部状态栏
        self.status_label = tk.Label(self.root, text="就绪", font=("微软雅黑", 9),
                                     fg="#666", anchor=tk.W, padx=10)
        self.status_label.pack(fill=tk.X, side=tk.BOTTOM)

        # 预置示例调查
        self.add_sample_surveys()

    def add_sample_surveys(self):
        self.surveys["你最喜欢的编程语言？"] = {
            "options": ["Python", "JavaScript", "Java", "C++", "Go", "Rust"],
            "votes": {"Python": 42, "JavaScript": 35, "Java": 18, "C++": 12, "Go": 8, "Rust": 15},
            "voters": set(),
            "created": "2026-08-28 10:00"
        }
        self.surveys["你每天使用手机多长时间？"] = {
            "options": ["1小时以内", "1-3小时", "3-5小时", "5小时以上"],
            "votes": {"1小时以内": 5, "1-3小时": 22, "3-5小时": 30, "5小时以上": 18},
            "voters": set(),
            "created": "2026-08-29 14:30"
        }
        self.surveys["你更偏好哪种工作方式？"] = {
            "options": ["远程办公", "办公室办公", "混合办公", "无所谓"],
            "votes": {"远程办公": 28, "办公室办公": 10, "混合办公": 35, "无所谓": 7},
            "voters": set(),
            "created": "2026-08-30 09:00"
        }
        self.refresh_list()

    def refresh_list(self):
        self.survey_listbox.delete(0, tk.END)
        for title in self.surveys:
            total = sum(self.surveys[title]["votes"].values())
            self.survey_listbox.insert(tk.END, f"{title} ({total}票)")

    def on_select_survey(self, event):
        selection = self.survey_listbox.curselection()
        if not selection:
            return
        title = list(self.surveys.keys())[selection[0]]
        self.current_survey = title
        self.show_survey_detail(title)

    def show_survey_detail(self, title):
        # 清空详情区域
        for widget in self.detail_frame.winfo_children():
            widget.destroy()

        survey = self.surveys[title]
        total_votes = sum(survey["votes"].values())
        has_voted = self.current_user in survey["voters"]

        # 标题
        tk.Label(self.detail_frame, text=title, font=("微软雅黑", 13, "bold"),
                 anchor=tk.W).pack(fill=tk.X, pady=(0, 5))
        tk.Label(self.detail_frame, text=f"创建时间: {survey['created']}  |  总票数: {total_votes}",
                 font=("微软雅黑", 9), fg="#666", anchor=tk.W).pack(fill=tk.X, pady=(0, 10))

        if has_voted:
            tk.Label(self.detail_frame, text="✅ 你已参与过此调查，以下为当前结果",
                     font=("微软雅黑", 9), fg="#4CAF50", anchor=tk.W).pack(fill=tk.X, pady=(0, 5))

        # 选项区域
        options_frame = tk.Frame(self.detail_frame)
        options_frame.pack(fill=tk.BOTH, expand=True, pady=5)

        self.vote_vars = {}

        for i, option in enumerate(survey["options"]):
            votes = survey["votes"].get(option, 0)
            percentage = (votes / total_votes * 100) if total_votes > 0 else 0

            row_frame = tk.Frame(options_frame)
            row_frame.pack(fill=tk.X, pady=3)

            # 单选按钮
            vote_var = tk.StringVar(value="")
            rb = tk.Radiobutton(row_frame, text=option, variable=vote_var, value=option,
                                font=("微软雅黑", 10), state=tk.DISABLED if has_voted else tk.NORMAL)
            rb.pack(side=tk.LEFT)
            self.vote_vars[option] = vote_var

            # 票数信息
            tk.Label(row_frame, text=f"{votes}票 ({percentage:.1f}%)",
                     font=("微软雅黑", 9), fg="#666").pack(side=tk.RIGHT, padx=5)

            # 进度条
            bar_frame = tk.Frame(options_frame, height=8)
            bar_frame.pack(fill=tk.X, pady=(0, 5))

            bar = ttk.Progressbar(bar_frame, length=400, mode='determinate', maximum=100)
            bar.pack(fill=tk.X)
            bar['value'] = percentage

        # 投票按钮
        if not has_voted:
            tk.Button(self.detail_frame, text="🗳️ 提交投票", font=("微软雅黑", 11, "bold"),
                      command=self.submit_vote, bg="#2196F3", fg="white",
                      width=15, pady=5).pack(pady=15)
        else:
            tk.Label(self.detail_frame, text="（投票已截止，仅可查看结果）",
                     font=("微软雅黑", 9), fg="#999").pack(pady=10)

    def submit_vote(self):
        if not self.current_survey:
            return

        survey = self.surveys[self.current_survey]

        # 获取选中的选项
        selected = None
        for option, var in self.vote_vars.items():
            if var.get() == option:
                selected = option
                break

        if not selected:
            messagebox.showwarning("提示", "请先选择一个选项！")
            return

        # 记录投票
        survey["votes"][selected] += 1
        survey["voters"].add(self.current_user)

        self.status_label.configure(text=f"✅ 投票成功！你选择了「{selected}」", fg="green")
        self.show_survey_detail(self.current_survey)
        self.refresh_list()

    def create_survey(self):
        # 弹出创建对话框
        dialog = tk.Toplevel(self.root)
        dialog.title("新建调查")
        dialog.geometry("450x400")
        dialog.resizable(False, False)
        dialog.transient(self.root)
        dialog.grab_set()

        tk.Label(dialog, text="调查标题:", font=("微软雅黑", 10)).pack(anchor=tk.W, padx=15, pady=(15, 5))
        title_entry = tk.Entry(dialog, font=("微软雅黑", 10), width=40)
        title_entry.pack(padx=15)

        tk.Label(dialog, text="选项（每行一个）:", font=("微软雅黑", 10)).pack(anchor=tk.W, padx=15, pady=(10, 5))
        options_text = tk.Text(dialog, font=("微软雅黑", 10), width=40, height=10)
        options_text.pack(padx=15)
        options_text.insert(tk.END, "选项1\n选项2\n选项3")

        def do_create():
            title = title_entry.get().strip()
            options_raw = options_text.get("1.0", tk.END).strip().split("\n")
            options = [o.strip() for o in options_raw if o.strip()]

            if not title:
                messagebox.showwarning("提示", "请输入调查标题！", parent=dialog)
                return
            if len(options) < 2:
                messagebox.showwarning("提示", "至少需要2个选项！", parent=dialog)
                return
            if title in self.surveys:
                messagebox.showwarning("提示", "该调查标题已存在！", parent=dialog)
                return

            self.surveys[title] = {
                "options": options,
                "votes": {opt: 0 for opt in options},
                "voters": set(),
                "created": datetime.now().strftime("%Y-%m-%d %H:%M")
            }

            self.refresh_list()
            self.status_label.configure(text=f"✅ 调查「{title}」创建成功！", fg="green")
            dialog.destroy()

        tk.Button(dialog, text="✅ 创建", font=("微软雅黑", 10), command=do_create,
                  bg="#4CAF50", fg="white", width=12).pack(pady=15)

    def delete_survey(self):
        selection = self.survey_listbox.curselection()
        if not selection:
            messagebox.showinfo("提示", "请先选择一个调查")
            return

        title = list(self.surveys.keys())[selection[0]]
        if messagebox.askyesno("确认删除", f"确定要删除调查「{title}」吗？"):
            del self.surveys[title]
            self.current_survey = None
            self.refresh_list()

            # 清空详情
            for widget in self.detail_frame.winfo_children():
                widget.destroy()
            self.welcome_label = tk.Label(self.detail_frame,
                                          text="👈 请从左侧选择一个调查\n\n或点击「新建调查」创建一个",
                                          font=("微软雅黑", 12), fg="#999", justify=tk.CENTER)
            self.welcome_label.pack(expand=True)

            self.status_label.configure(text=f"🗑️ 已删除调查「{title}」", fg="orange")


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