import tkinter as tk
from tkinter import font

# =======================
# 汇率数据
# =======================
RATES = {
    "人民币 CNY": 1.0, "美元 USD": 7.24, "欧元 EUR": 7.86,
    "日元 JPY": 0.048, "英镑 GBP": 9.12, "韩元 KRW": 0.0054,
    "港币 HKD": 0.93, "新台币 TWD": 0.23, "新加坡元 SGD": 5.38,
    "加拿大元 CAD": 5.35, "澳大利亚元 AUD": 4.78, "瑞士法郎 CHF": 8.15,
    "泰铢 THB": 0.20, "俄罗斯卢布 RUB": 0.078, "印度卢比 INR": 0.087,
}

SYMBOLS = {
    "人民币 CNY": "¥", "美元 USD": "$", "欧元 EUR": "€",
    "日元 JPY": "¥", "英镑 GBP": "£", "韩元 KRW": "₩",
    "港币 HKD": "HK$", "新台币 TWD": "NT$", "新加坡元 SGD": "S$",
    "加拿大元 CAD": "C$", "澳大利亚元 AUD": "A$", "瑞士法郎 CHF": "CHF",
    "泰铢 THB": "฿", "俄罗斯卢布 RUB": "₽", "印度卢比 INR": "₹",
}

# =======================
# 浅色主题（默认）
# =======================
LIGHT = {
    "bg": "#f6f7fb",          # 页面背景
    "card": "#ffffff",        # 卡片
    "border": "#e4e7ef",      # 边框
    "input_bg": "#f1f3f9",    # 输入框
    "primary": "#4a6cf7",     # 主色（蓝）
    "primary_hover": "#6a8cff",
    "text": "#1a1a2e",        # 主文字
    "sub": "#7a7f9a",         # 副文字
    "success": "#00a86b",     # 结果绿
    "quick_bg": "#f0f2f8",
    "quick_fg": "#555577",
}

# =======================
# 深色主题（可选）
# =======================
DARK = {
    "bg": "#0f0f1a", "card": "#1a1a2e", "border": "#2a2a4a",
    "input_bg": "#252542", "primary": "#6c63ff", "primary_hover": "#8b83ff",
    "text": "#ffffff", "sub": "#888899", "success": "#00d4aa",
    "quick_bg": "#1e1e36", "quick_fg": "#aaaacc",
}

class CurrencyConverter:
    def __init__(self, root):
        self.root = root
        self.root.title("货币转换器")
        self.root.geometry("420x820")
        self.root.resizable(False, False)

        self.theme = LIGHT
        self.dark_mode = False

        self.amount_var = tk.StringVar(value="100")
        self.from_var = tk.StringVar(value="人民币 CNY")
        self.to_var = tk.StringVar(value="美元 USD")
        self.result_var = tk.StringVar(value="")

        self.widgets = {}
        self.build_ui()
        self.calculate()

    # ---------- UI ----------
    def build_ui(self):
        t = self.theme

        # 顶部
        top = tk.Frame(self.root, bg=t["bg"])
        top.pack(fill="x", pady=(20, 10))
        self.widgets["top"] = top

        tk.Label(
            top, text="💱 货币转换器",
            font=("PingFang SC", 22, "bold"),
            bg=t["bg"], fg=t["text"]
        ).pack()

        tk.Label(
            top, text="实时汇率换算",
            font=("PingFang SC", 11),
            bg=t["bg"], fg=t["sub"]
        ).pack(pady=(2, 0))

        # 主题切换
        mode_frame = tk.Frame(self.root, bg=t["bg"])
        mode_frame.pack(fill="x", padx=20)
        self.widgets["mode_frame"] = mode_frame

        tk.Button(
            mode_frame, text="🌙 深色模式" if not self.dark_mode else "☀️ 浅色模式",
            font=("PingFang SC", 10),
            bg=t["primary"], fg="#ffffff",
            activebackground=t["primary_hover"],
            relief="flat", cursor="hand2",
            padx=12, pady=4,
            command=self.toggle_theme
        ).pack(anchor="e")

        # 输入卡片
        card = tk.Frame(
            self.root, bg=t["card"],
            highlightbackground=t["border"], highlightthickness=1,
            padx=20, pady=18
        )
        card.pack(fill="x", padx=20, pady=(10, 8))
        self.widgets["card"] = card

        # 金额
        tk.Label(card, text="金额", font=("PingFang SC", 11),
                 bg=t["card"], fg=t["sub"], anchor="w").pack(fill="x")

        row = tk.Frame(card, bg=t["card"])
        row.pack(fill="x", pady=(5, 12))

        self.symbol_label = tk.Label(
            row, text="¥", font=("PingFang SC", 22, "bold"),
            bg=t["card"], fg=t["primary"]
        )
        self.symbol_label.pack(side="left", padx=(0, 8))

        entry = tk.Entry(
            row, textvariable=self.amount_var,
            font=("PingFang SC", 26, "bold"),
            bg=t["card"], fg=t["text"],
            relief="flat", justify="right", width=12,
            insertbackground=t["text"]
        )
        entry.pack(side="right", fill="x", expand=True)
        entry.bind("<KeyRelease>", self.calculate)

        # 从
        tk.Label(card, text="从", font=("PingFang SC", 11),
                 bg=t["card"], fg=t["sub"], anchor="w").pack(fill="x")

        self.from_btn = self._menu_btn(card, self.from_var, t)
        self.from_btn.pack(fill="x", pady=(3, 10))

        # 交换
        tk.Button(
            self.root, text="⇅ 交换货币",
            font=("PingFang SC", 12, "bold"),
            bg=t["primary"], fg="#ffffff",
            activebackground=t["primary_hover"],
            relief="flat", cursor="hand2",
            padx=20, pady=6,
            command=self.swap
        ).pack(pady=(0, 8))

        # 输出卡片
        out = tk.Frame(
            self.root, bg=t["card"],
            highlightbackground=t["border"], highlightthickness=1,
            padx=20, pady=18
        )
        out.pack(fill="x", padx=20, pady=(0, 12))

        tk.Label(out, text="到", font=("PingFang SC", 11),
                 bg=t["card"], fg=t["sub"], anchor="w").pack(fill="x")

        self.to_btn = self._menu_btn(out, self.to_var, t)
        self.to_btn.pack(fill="x", pady=(3, 12))

        tk.Label(out, text="转换结果", font=("PingFang SC", 11),
                 bg=t["card"], fg=t["sub"], anchor="w").pack(fill="x")

        res_row = tk.Frame(out, bg=t["card"])
        res_row.pack(fill="x", pady=(5, 5))

        self.result_symbol = tk.Label(
            res_row, text="$", font=("PingFang SC", 22, "bold"),
            bg=t["card"], fg=t["success"]
        )
        self.result_symbol.pack(side="left", padx=(0, 8))

        tk.Label(
            res_row, textvariable=self.result_var,
            font=("PingFang SC", 26, "bold"),
            bg=t["card"], fg=t["success"]
        ).pack(side="left")

        self.rate_label = tk.Label(
            out, text="", font=("PingFang SC", 10),
            bg=t["card"], fg=t["sub"]
        )
        self.rate_label.pack(anchor="w", pady=(5, 0))

        # 快捷金额
        qf = tk.Frame(self.root, bg=t["bg"])
        qf.pack(fill="x", padx=20, pady=(5, 10))

        tk.Label(qf, text="快捷金额", font=("PingFang SC", 11),
                 bg=t["bg"], fg=t["sub"]).pack(anchor="w", pady=(0, 5))

        amounts = [1, 5, 10, 50, 100, 500, 1000, 5000, 10000]
        r1 = tk.Frame(qf, bg=t["bg"])
        r1.pack(fill="x")
        r2 = tk.Frame(qf, bg=t["bg"])
        r2.pack(fill="x", pady=(6, 0))

        for i, a in enumerate(amounts):
            p = r1 if i < 5 else r2
            tk.Button(
                p, text=f"¥{a}", width=8,
                font=("PingFang SC", 10),
                bg=t["quick_bg"], fg=t["quick_fg"],
                activebackground=t["primary"],
                activeforeground="#ffffff",
                relief="flat", cursor="hand2",
                command=lambda x=a: self.set_amount(x)
            ).pack(side="left", padx=3)

        # 历史
        hf = tk.Frame(self.root, bg=t["bg"])
        hf.pack(fill="both", expand=True, padx=20, pady=(5, 15))

        tk.Label(hf, text="📜 转换历史", font=("PingFang SC", 11),
                 bg=t["bg"], fg=t["sub"]).pack(anchor="w")

        self.history = tk.Text(
            hf, height=5, font=("PingFang SC", 10),
            bg=t["card"], fg=t["text"],
            relief="flat",
            highlightbackground=t["border"],
            highlightthickness=1,
            padx=10, pady=5,
            state="disabled"
        )
        self.history.pack(fill="both", expand=True)

    # ---------- 工具 ----------
    def _menu_btn(self, parent, var, t):
        btn = tk.Menubutton(
            parent, textvariable=var,
            font=("PingFang SC", 13),
            bg=t["input_bg"], fg=t["text"],
            activebackground=t["primary"],
            activeforeground="#ffffff",
            relief="flat",
            padx=12, pady=6, anchor="w"
        )
        menu = tk.Menu(btn, tearoff=0,
                       bg=t["input_bg"], fg=t["text"],
                       activebackground=t["primary"],
                       activeforeground="#ffffff")
        for c in RATES:
            menu.add_radiobutton(label=c, variable=var, value=c,
                                 command=self.calculate)
        btn["menu"] = menu
        return btn

    def toggle_theme(self):
        self.dark_mode = not self.dark_mode
        self.theme = DARK if self.dark_mode else LIGHT
        self.reapply_theme()

    def reapply_theme(self):
        t = self.theme
        self.root.configure(bg=t["bg"])

        for w in self.widgets.values():
            try:
                w.configure(bg=t["bg"])
            except:
                pass

        self.symbol_label.configure(bg=t["card"], fg=t["primary"])
        self.result_symbol.configure(bg=t["card"], fg=t["success"])
        self.rate_label.configure(bg=t["card"], fg=t["sub"])
        self.history.configure(bg=t["card"], fg=t["text"],
                               highlightbackground=t["border"])

        # 简单刷新
        self.calculate()

    def set_amount(self, a):
        self.amount_var.set(str(a))
        self.calculate()

    def swap(self):
        s, d = self.from_var.get(), self.to_var.get()
        self.from_var.set(d)
        self.to_var.set(s)
        self.symbol_label.config(text=SYMBOLS.get(d, ""))
        self.calculate()

    def calculate(self, e=None):
        try:
            a = float(self.amount_var.get())
        except:
            return

        src, dst = self.from_var.get(), self.to_var.get()
        if src not in RATES or dst not in RATES:
            return

        val = a * RATES[src] / RATES[dst]
        self.result_var.set(f"{val:,.2f}")
        self.result_symbol.config(text=SYMBOLS.get(dst, ""))
        self.rate_label.config(
            text=f"1 {src.split()[-1]} = {RATES[src]/RATES[dst]:.4f} {dst.split()[-1]}"
        )

        self.history.configure(state="normal")
        self.history.insert(
            "1.0",
            f"{SYMBOLS.get(src,'')}{a:g} → {SYMBOLS.get(dst,'')}{val:,.2f}\n"
        )
        self.history.configure(state="disabled")

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