#!/usr/bin/env python3
# -*- coding: utf-8 -*-

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

class CurrencyConverterApp:
    def __init__(self):
        self.root = tk.Tk()
        self.root.title("货币单位转换器")
        self.root.geometry("1000x800")
        self.root.resizable(False, False)
        
        # 汇率数据（以人民币为基准）
        self.rates = {
            'CNY': 1.0000,    # 人民币
            'USD': 0.1385,    # 美元
            'EUR': 0.1270,    # 欧元
            'GBP': 0.1095,    # 英镑
            'JPY': 20.8500,   # 日元
            'KRW': 183.2500,  # 韩元
            'HKD': 1.0830,    # 港币
            'AUD': 0.2120,    # 澳元
            'CAD': 0.1885,    # 加元
            'SGD': 0.1860,    # 新加坡元
            'CHF': 0.1220,    # 瑞士法郎
            'THB': 4.9500,    # 泰铢
            'TWD': 4.4200,    # 新台币
            'INR': 11.5200,   # 印度卢比
            'MYR': 0.6480,    # 马来西亚林吉特
            'PHP': 7.8200,    # 菲律宾比索
            'VND': 3390.0000, # 越南盾
            'IDR': 2165.0000, # 印尼盾
            'RUB': 12.6800,   # 俄罗斯卢布
            'MXN': 2.7500,    # 墨西哥比索
            'BRL': 0.7650,    # 巴西雷亚尔
            'ZAR': 2.6200,    # 南非兰特
            'TRY': 4.1500,    # 土耳其里拉
            'AED': 0.5085,    # 阿联酋迪拉姆
            'SAR': 0.5195,    # 沙特里亚尔
            'KWD': 0.0425,    # 科威特第纳尔
            'QAR': 0.5040,    # 卡塔尔里亚尔
            'SEK': 1.4300,    # 瑞典克朗
            'NOK': 1.4750,    # 挪威克朗
            'DKK': 0.9450,    # 丹麦克朗
        }
        
        # 货币名称
        self.currency_names = {
            'CNY': '人民币', 'USD': '美元', 'EUR': '欧元', 'GBP': '英镑',
            'JPY': '日元', 'KRW': '韩元', 'HKD': '港币', 'AUD': '澳元',
            'CAD': '加元', 'SGD': '新加坡元', 'CHF': '瑞士法郎', 'THB': '泰铢',
            'TWD': '新台币', 'INR': '印度卢比', 'MYR': '马来西亚林吉特',
            'PHP': '菲律宾比索', 'VND': '越南盾', 'IDR': '印尼盾',
            'RUB': '俄罗斯卢布', 'MXN': '墨西哥比索', 'BRL': '巴西雷亚尔',
            'ZAR': '南非兰特', 'TRY': '土耳其里拉', 'AED': '阿联酋迪拉姆',
            'SAR': '沙特里亚尔', 'KWD': '科威特第纳尔', 'QAR': '卡塔尔里亚尔',
            'SEK': '瑞典克朗', 'NOK': '挪威克朗', 'DKK': '丹麦克朗'
        }
        
        # 货币符号
        self.symbols = {
            'CNY': '¥', 'USD': '$', 'EUR': '€', 'GBP': '£', 'JPY': '¥',
            'KRW': '₩', 'HKD': 'HK$', 'AUD': 'A$', 'CAD': 'C$', 'SGD': 'S$',
            'CHF': 'Fr', 'THB': '฿', 'TWD': 'NT$', 'INR': '₹', 'MYR': 'RM',
            'PHP': '₱', 'VND': '₫', 'IDR': 'Rp', 'RUB': '₽', 'MXN': 'Mex$',
            'BRL': 'R$', 'ZAR': 'R', 'TRY': '₺', 'AED': 'د.إ', 'SAR': '﷼',
            'KWD': 'د.ك', 'QAR': 'ر.ق', 'SEK': 'kr', 'NOK': 'kr', 'DKK': 'kr'
        }
        
        # 历史记录
        self.history = []
        
        # 创建界面
        self.setup_ui()
        
        # 居中显示
        self.center_window()
        
    def center_window(self):
        """窗口居中"""
        self.root.update_idletasks()
        width = self.root.winfo_width()
        height = self.root.winfo_height()
        x = (self.root.winfo_screenwidth() // 2) - (width // 2)
        y = (self.root.winfo_screenheight() // 2) - (height // 2)
        self.root.geometry(f'{width}x{height}+{x}+{y}')
    
    def setup_ui(self):
        """设置界面"""
        # 主框架
        main_frame = ttk.Frame(self.root, padding="10")
        main_frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
        
        # ===== 标题 =====
        title_label = ttk.Label(
            main_frame, 
            text="💰 货币单位转换器",
            font=('微软雅黑', 20, 'bold')
        )
        title_label.grid(row=0, column=0, columnspan=3, pady=(0, 20))
        
        # ===== 转换区域 =====
        convert_frame = ttk.LabelFrame(main_frame, text="货币转换", padding="15")
        convert_frame.grid(row=1, column=0, columnspan=3, sticky=(tk.W, tk.E), pady=(0, 15))
        
        # 金额输入
        ttk.Label(convert_frame, text="金额:", font=('微软雅黑', 11)).grid(row=0, column=0, sticky=tk.W, padx=(0, 10))
        self.amount_var = tk.StringVar(value="  ")
        self.amount_entry = ttk.Entry(convert_frame, textvariable=self.amount_var, width=25, font=('微软雅黑', 11))
        self.amount_entry.grid(row=0, column=1, sticky=(tk.W, tk.E), padx=(0, 10))
        
        # 源货币
        ttk.Label(convert_frame, text="源货币:", font=('微软雅黑', 11)).grid(row=1, column=0, sticky=tk.W, pady=10)
        self.from_var = tk.StringVar()
        self.from_combo = ttk.Combobox(convert_frame, textvariable=self.from_var, width=22, font=('微软雅黑', 11), state='readonly')
        self.from_combo['values'] = [f"{code} - {self.currency_names[code]}" for code in self.rates.keys()]
        self.from_combo.set("CNY - 人民币")
        self.from_combo.grid(row=1, column=1, sticky=(tk.W, tk.E))
        
        # 目标货币
        ttk.Label(convert_frame, text="目标货币:", font=('微软雅黑', 11)).grid(row=2, column=0, sticky=tk.W, pady=10)
        self.to_var = tk.StringVar()
        self.to_combo = ttk.Combobox(convert_frame, textvariable=self.to_var, width=22, font=('微软雅黑', 11), state='readonly')
        self.to_combo['values'] = [f"{code} - {self.currency_names[code]}" for code in self.rates.keys()]
        self.to_combo.set("USD - 美元")
        self.to_combo.grid(row=2, column=1, sticky=(tk.W, tk.E))
        
        # 按钮框架
        button_frame = ttk.Frame(convert_frame)
        button_frame.grid(row=3, column=0, columnspan=2, pady=15)
        
        # 转换按钮
        self.convert_btn = ttk.Button(
            button_frame, 
            text="🔄 转换", 
            command=self.convert,
            width=12
        )
        self.convert_btn.pack(side=tk.LEFT, padx=5)
        
        # 交换按钮
        self.swap_btn = ttk.Button(
            button_frame, 
            text="⇄ 交换", 
            command=self.swap_currencies,
            width=12
        )
        self.swap_btn.pack(side=tk.LEFT, padx=5)
        
        # 清空按钮
        self.clear_btn = ttk.Button(
            button_frame, 
            text="🗑️ 清空", 
            command=self.clear_input,
            width=12
        )
        self.clear_btn.pack(side=tk.LEFT, padx=5)
        
        # ===== 结果显示区域 =====
        result_frame = ttk.LabelFrame(main_frame, text="转换结果", padding="10")
        result_frame.grid(row=2, column=0, columnspan=3, sticky=(tk.W, tk.E), pady=(0, 15))
        
        self.result_text = tk.Text(
            result_frame, 
            height=4, 
            width=70,
            font=('微软雅黑', 12),
            state='disabled',
            bg='#f8f9fa',
            relief=tk.FLAT,
            wrap=tk.WORD
        )
        self.result_text.pack(fill=tk.BOTH, expand=True)
        
        # ===== 历史记录区域 =====
        history_frame = ttk.LabelFrame(main_frame, text="历史记录", padding="10")
        history_frame.grid(row=3, column=0, columnspan=3, sticky=(tk.W, tk.E, tk.N, tk.S))
        
        # 历史记录文本框
        text_frame = ttk.Frame(history_frame)
        text_frame.pack(fill=tk.BOTH, expand=True)
        
        self.history_text = tk.Text(
            text_frame,
            height=8,
            width=70,
            font=('微软雅黑', 10),
            state='disabled',
            bg='white',
            relief=tk.SUNKEN,
            wrap=tk.WORD
        )
        self.history_text.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        
        # 滚动条
        scrollbar = ttk.Scrollbar(text_frame, orient=tk.VERTICAL, command=self.history_text.yview)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        self.history_text.config(yscrollcommand=scrollbar.set)
        
        # 历史记录按钮
        hist_btn_frame = ttk.Frame(history_frame)
        hist_btn_frame.pack(fill=tk.X, pady=(5, 0))
        
        ttk.Button(
            hist_btn_frame,
            text="清空历史",
            command=self.clear_history,
            width=12
        ).pack(side=tk.LEFT, padx=5)
        
        ttk.Button(
            hist_btn_frame,
            text="导出历史",
            command=self.export_history,
            width=12
        ).pack(side=tk.LEFT, padx=5)
        
        # 配置网格权重
        self.root.columnconfigure(0, weight=1)
        self.root.rowconfigure(0, weight=1)
        main_frame.columnconfigure(1, weight=1)
        main_frame.rowconfigure(3, weight=1)
        convert_frame.columnconfigure(1, weight=1)
        history_frame.columnconfigure(0, weight=1)
        history_frame.rowconfigure(0, weight=1)
        
        # 绑定回车键
        self.amount_entry.bind('<Return>', lambda e: self.convert())
        
        # 初始显示
        self.convert()
    
    def get_currency_code(self, display_text):
        """从显示文本中提取货币代码"""
        return display_text.split(' - ')[0]
    
    def convert(self):
        """执行货币转换"""
        try:
            # 获取输入
            amount_text = self.amount_var.get().strip()
            if not amount_text:
                messagebox.showwarning("警告", "请输入金额")
                return
            
            amount = float(amount_text)
            if amount < 0:
                messagebox.showwarning("警告", "金额不能为负数")
                return
            
            from_code = self.get_currency_code(self.from_var.get())
            to_code = self.get_currency_code(self.to_var.get())
            
            # 执行转换
            from_rate = self.rates[from_code]
            to_rate = self.rates[to_code]
            
            # 先转成人民币，再转成目标货币
            cny_amount = amount / from_rate
            result = cny_amount * to_rate
            
            # 格式化结果
            from_name = self.currency_names[from_code]
            to_name = self.currency_names[to_code]
            from_symbol = self.symbols[from_code]
            to_symbol = self.symbols[to_code]
            
            # 根据货币调整小数位
            if to_code in ['JPY', 'KRW', 'IDR', 'VND']:
                decimals = 0
            else:
                decimals = 2
            
            result_text = (
                f"{from_symbol}{amount:,.2f} {from_name}({from_code})\n"
                f"  ↓  汇率: 1 {from_code} = {to_rate/from_rate:.6f} {to_code}\n"
                f"={to_symbol}{result:,.{decimals}f} {to_name}({to_code})"
            )
            
            # 显示结果
            self.result_text.config(state='normal')
            self.result_text.delete('1.0', tk.END)
            self.result_text.insert('1.0', result_text)
            self.result_text.config(state='disabled')
            
            # 添加到历史记录
            timestamp = datetime.datetime.now().strftime("%H:%M:%S")
            history_entry = f"[{timestamp}] {from_symbol}{amount:,.2f} {from_code} → {to_symbol}{result:,.{decimals}f} {to_code}"
            self.history.append(history_entry)
            self.update_history_display()
            
        except ValueError:
            messagebox.showerror("错误", "请输入有效的数字金额")
        except Exception as e:
            messagebox.showerror("错误", f"转换失败: {str(e)}")
    
    def swap_currencies(self):
        """交换源货币和目标货币"""
        from_val = self.from_var.get()
        to_val = self.to_var.get()
        self.from_var.set(to_val)
        self.to_var.set(from_val)
        self.convert()
    
    def clear_input(self):
        """清空输入"""
        self.amount_var.set("")
        self.result_text.config(state='normal')
        self.result_text.delete('1.0', tk.END)
        self.result_text.config(state='disabled')
        self.amount_entry.focus()
    
    def clear_history(self):
        """清空历史记录"""
        if messagebox.askyesno("确认", "确定要清空所有历史记录吗？"):
            self.history.clear()
            self.update_history_display()
    
    def export_history(self):
        """导出历史记录"""
        if not self.history:
            messagebox.showinfo("提示", "没有历史记录可以导出")
            return
        
        try:
            from tkinter import filedialog
            filename = filedialog.asksaveasfilename(
                defaultextension=".txt",
                filetypes=[("文本文件", "*.txt"), ("所有文件", "*.*")],
                initialfile=f"货币转换历史_{datetime.datetime.now().strftime('%Y%m%d')}.txt"
            )
            
            if filename:
                with open(filename, 'w', encoding='utf-8') as f:
                    f.write("货币转换历史记录\n")
                    f.write("=" * 50 + "\n")
                    f.write(f"导出时间: {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
                    f.write("=" * 50 + "\n\n")
                    for entry in self.history:
                        f.write(entry + "\n")
                messagebox.showinfo("成功", f"历史记录已导出到:\n{filename}")
                
        except Exception as e:
            messagebox.showerror("错误", f"导出失败: {str(e)}")
    
    def update_history_display(self):
        """更新历史记录显示"""
        self.history_text.config(state='normal')
        self.history_text.delete('1.0', tk.END)
        
        # 显示最近的20条记录
        start = max(0, len(self.history) - 20)
        for entry in self.history[start:]:
            self.history_text.insert(tk.END, entry + "\n")
        
        self.history_text.config(state='disabled')
        # 滚动到底部
        self.history_text.see(tk.END)
    
    def run(self):
        """运行应用"""
        self.root.mainloop()


def main():
    app = CurrencyConverterApp()
    app.run()


if __name__ == "__main__":
    main()