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

class CurrencyConverter:
    def __init__(self, root):
        self.root = root
        self.root.title("货币单位转换器")
        self.root.geometry("500x400")
        self.root.configure(bg='#f0f0f0')
        
        # 设置窗口图标
        try:
            self.root.iconbitmap('currency.ico')
        except:
            pass
        
        # 货币代码和名称映射
        self.currencies = {
            'USD': '美元 (USD)',
            'EUR': '欧元 (EUR)',
            'JPY': '日元 (JPY)',
            'GBP': '英镑 (GBP)',
            'AUD': '澳元 (AUD)',
            'CAD': '加元 (CAD)',
            'CHF': '瑞士法郎 (CHF)',
            'CNY': '人民币 (CNY)',
            'HKD': '港币 (HKD)',
            'KRW': '韩元 (KRW)',
            'SGD': '新加坡元 (SGD)',
            'INR': '印度卢比 (INR)',
            'RUB': '俄罗斯卢布 (RUB)',
            'BRL': '巴西雷亚尔 (BRL)',
            'ZAR': '南非兰特 (ZAR)',
            'MXN': '墨西哥比索 (MXN)',
            'AED': '阿联酋迪拉姆 (AED)',
            'TRY': '土耳其里拉 (TRY)',
            'MYR': '马来西亚林吉特 (MYR)',
            'THB': '泰铢 (THB)',
            'VND': '越南盾 (VND)',
            'IDR': '印尼盾 (IDR)',
            'PHP': '菲律宾比索 (PHP)',
        }
        
        # 汇率缓存
        self.exchange_rates = {}
        self.last_update = None
        
        # 创建界面
        self.create_widgets()
        
        # 初始化时获取汇率
        self.get_exchange_rates()

    def create_widgets(self):
        # 标题
        title_label = tk.Label(
            self.root, 
            text="货币单位转换器", 
            font=("微软雅黑", 20, "bold"), 
            bg='#f0f0f0', 
            fg='#2c3e50'
        )
        title_label.pack(pady=10)
        
        # 货币选择框架
        currency_frame = tk.Frame(self.root, bg='#f0f0f0')
        currency_frame.pack(pady=10)
        
        # 从货币
        from_label = tk.Label(
            currency_frame, 
            text="从:", 
            font=("微软雅黑", 12), 
            bg='#f0f0f0'
        )
        from_label.grid(row=0, column=0, padx=5, pady=5)
        
        self.from_currency = ttk.Combobox(
            currency_frame, 
            values=list(self.currencies.values()), 
            width=20, 
            font=("微软雅黑", 10)
        )
        self.from_currency.grid(row=0, column=1, padx=5, pady=5)
        self.from_currency.current(0)  # 默认选择美元
        
        # 到货币
        to_label = tk.Label(
            currency_frame, 
            text="到:", 
            font=("微软雅黑", 12), 
            bg='#f0f0f0'
        )
        to_label.grid(row=0, column=2, padx=5, pady=5)
        
        self.to_currency = ttk.Combobox(
            currency_frame, 
            values=list(self.currencies.values()), 
            width=20, 
            font=("微软雅黑", 10)
        )
        self.to_currency.grid(row=0, column=3, padx=5, pady=5)
        self.to_currency.current(7)  # 默认选择人民币
        
        # 金额输入框架
        amount_frame = tk.Frame(self.root, bg='#f0f0f0')
        amount_frame.pack(pady=10)
        
        amount_label = tk.Label(
            amount_frame, 
            text="金额:", 
            font=("微软雅黑", 12), 
            bg='#f0f0f0'
        )
        amount_label.grid(row=0, column=0, padx=5, pady=5)
        
        self.amount_var = tk.StringVar()
        self.amount_entry = tk.Entry(
            amount_frame, 
            textvariable=self.amount_var, 
            width=20, 
            font=("微软雅黑", 12), 
            bd=2, 
            relief="groove"
        )
        self.amount_entry.grid(row=0, column=1, padx=5, pady=5)
        self.amount_entry.insert(0, "1.00")
        
        # 转换按钮
        convert_button = tk.Button(
            self.root, 
            text="转换", 
            command=self.convert_currency, 
            bg='#3498db', 
            fg='white', 
            font=("微软雅黑", 12, "bold"), 
            padx=20, 
            pady=5,
            cursor="hand2"
        )
        convert_button.pack(pady=10)
        
        # 结果显示
        result_frame = tk.Frame(self.root, bg='#f0f0f0')
        result_frame.pack(pady=10)
        
        result_label = tk.Label(
            result_frame, 
            text="转换结果:", 
            font=("微软雅黑", 12), 
            bg='#f0f0f0'
        )
        result_label.grid(row=0, column=0, padx=5, pady=5)
        
        self.result_var = tk.StringVar()
        self.result_var.set("0.00")
        
        result_display = tk.Label(
            result_frame, 
            textvariable=self.result_var, 
            font=("微软雅黑", 14, "bold"), 
            bg='#ecf0f1', 
            fg='#2c3e50',
            width=25,
            height=2,
            relief="sunken",
            anchor="center"
        )
        result_display.grid(row=0, column=1, padx=5, pady=5)
        
        # 汇率显示
        self.rate_var = tk.StringVar()
        self.rate_var.set("汇率: 正在获取...")
        
        rate_label = tk.Label(
            self.root, 
            textvariable=self.rate_var, 
            font=("微软雅黑", 10), 
            bg='#f0f0f0', 
            fg='#7f8c8d'
        )
        rate_label.pack(pady=5)
        
        # 更新时间显示
        self.update_var = tk.StringVar()
        self.update_var.set("最后更新: 从未更新")
        
        update_label = tk.Label(
            self.root, 
            textvariable=self.update_var, 
            font=("微软雅黑", 9), 
            bg='#f0f0f0', 
            fg='#95a5a6'
        )
        update_label.pack(pady=5)
        
        # 按钮框架
        button_frame = tk.Frame(self.root, bg='#f0f0f0')
        button_frame.pack(pady=10)
        
        # 刷新汇率按钮
        refresh_button = tk.Button(
            button_frame, 
            text="刷新汇率", 
            command=self.get_exchange_rates, 
            bg='#2ecc71', 
            fg='white', 
            font=("微软雅黑", 10), 
            padx=10,
            cursor="hand2"
        )
        refresh_button.grid(row=0, column=0, padx=5)
        
        # 交换货币按钮
        swap_button = tk.Button(
            button_frame, 
            text="交换货币", 
            command=self.swap_currencies, 
            bg='#f39c12', 
            fg='white', 
            font=("微软雅黑", 10), 
            padx=10,
            cursor="hand2"
        )
        swap_button.grid(row=0, column=1, padx=5)
        
        # 清除按钮
        clear_button = tk.Button(
            button_frame, 
            text="清除", 
            command=self.clear_all, 
            bg='#e74c3c', 
            fg='white', 
            font=("微软雅黑", 10), 
            padx=10,
            cursor="hand2"
        )
        clear_button.grid(row=0, column=2, padx=5)
        
        # 绑定回车键
        self.root.bind('<Return>', lambda event: self.convert_currency())

    def get_currency_code(self, currency_string):
        """从货币描述字符串获取货币代码"""
        for code, name in self.currencies.items():
            if name == currency_string:
                return code
        return 'USD'

    def get_exchange_rates(self):
        """从API获取汇率数据"""
        try:
            # 使用免费汇率API
            response = requests.get("https://api.exchangerate-api.com/v4/latest/USD", timeout=5)
            
            if response.status_code == 200:
                data = response.json()
                self.exchange_rates = data['rates']
                self.last_update = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                self.update_var.set(f"最后更新: {self.last_update}")
                messagebox.showinfo("成功", "汇率数据已成功更新！")
                
                # 保存到文件
                with open('exchange_rates.json', 'w') as f:
                    json.dump({
                        'rates': self.exchange_rates,
                        'last_update': self.last_update
                    }, f)
                    
            else:
                # 如果API失败，尝试从文件加载
                self.load_from_file()
                
        except Exception as e:
            # 如果网络请求失败，尝试从文件加载
            self.load_from_file()
    
    def load_from_file(self):
        """从文件加载缓存的汇率数据"""
        try:
            if os.path.exists('exchange_rates.json'):
                with open('exchange_rates.json', 'r') as f:
                    data = json.load(f)
                    self.exchange_rates = data['rates']
                    self.last_update = data.get('last_update', '未知时间')
                    self.update_var.set(f"最后更新: {self.last_update} (缓存)")
            else:
                # 如果没有缓存，使用预设汇率
                self.set_default_rates()
        except:
            self.set_default_rates()
    
    def set_default_rates(self):
        """设置默认汇率（当无法获取实时汇率时使用）"""
        self.exchange_rates = {
            'USD': 1.0,    # 美元
            'EUR': 0.92,   # 欧元
            'JPY': 150.0,  # 日元
            'GBP': 0.79,   # 英镑
            'AUD': 1.52,   # 澳元
            'CAD': 1.35,   # 加元
            'CHF': 0.88,   # 瑞士法郎
            'CNY': 7.25,   # 人民币
            'HKD': 7.82,   # 港币
            'KRW': 1330.0, # 韩元
            'SGD': 1.35,   # 新加坡元
            'INR': 83.0,   # 印度卢比
            'RUB': 92.0,    # 俄罗斯卢布
        }
        self.last_update = "使用默认汇率"
        self.update_var.set(f"最后更新: {self.last_update}")

    def convert_currency(self):
        """执行货币转换"""
        try:
            # 获取输入的金额
            amount = float(self.amount_var.get())
            
            # 获取选择的货币
            from_curr = self.get_currency_code(self.from_currency.get())
            to_curr = self.get_currency_code(self.to_currency.get())
            
            # 检查汇率数据是否存在
            if not self.exchange_rates:
                messagebox.showwarning("警告", "没有可用的汇率数据，请先刷新汇率")
                return
            
            # 计算转换
            if from_curr == 'USD':
                # 从美元转换
                converted_amount = amount * self.exchange_rates.get(to_curr, 1.0)
            elif to_curr == 'USD':
                # 转换到美元
                converted_amount = amount / self.exchange_rates.get(from_curr, 1.0)
            else:
                # 通过美元中间转换
                amount_in_usd = amount / self.exchange_rates.get(from_curr, 1.0)
                converted_amount = amount_in_usd * self.exchange_rates.get(to_curr, 1.0)
            
            # 显示结果
            self.result_var.set(f"{converted_amount:,.2f}")
            
            # 显示汇率
            if from_curr == 'USD':
                rate = self.exchange_rates.get(to_curr, 1.0)
                self.rate_var.set(f"汇率: 1 {from_curr} = {rate:.4f} {to_curr}")
            elif to_curr == 'USD':
                rate = 1 / self.exchange_rates.get(from_curr, 1.0)
                self.rate_var.set(f"汇率: 1 {from_curr} = {rate:.4f} {to_curr}")
            else:
                rate_from = self.exchange_rates.get(from_curr, 1.0)
                rate_to = self.exchange_rates.get(to_curr, 1.0)
                rate = rate_to / rate_from
                self.rate_var.set(f"汇率: 1 {from_curr} = {rate:.4f} {to_curr}")
                
        except ValueError:
            messagebox.showerror("错误", "请输入有效的数字金额")
        except Exception as e:
            messagebox.showerror("错误", f"转换过程中发生错误: {str(e)}")

    def swap_currencies(self):
        """交换源货币和目标货币"""
        from_index = self.from_currency.current()
        to_index = self.to_currency.current()
        
        self.from_currency.current(to_index)
        self.to_currency.current(from_index)
        
        # 如果已经有结果，重新计算
        try:
            if float(self.result_var.get()) != 0:
                self.convert_currency()
        except:
            pass

    def clear_all(self):
        """清除所有输入和结果"""
        self.amount_var.set("")
        self.result_var.set("0.00")
        self.rate_var.set("汇率: 未计算")

def main():
    root = tk.Tk()
    app = CurrencyConverter(root)
    root.mainloop()

if __name__ == "__main__":
    main()