# -*- coding: utf-8 -*-
"""
货币单位转换器 - 图形界面版本
使用tkinter库实现
"""

import tkinter as tk
from tkinter import ttk, messagebox
from tkinter import font as tkfont

class CurrencyConverterGUI:
    """货币转换器图形界面"""
    
    # 汇率数据（以人民币为基准）
    EXCHANGE_RATES = {
        'CNY': 1.0,      # 人民币
        'USD': 0.14,     # 美元
        'EUR': 0.13,     # 欧元
        'JPY': 15.5,     # 日元
        'GBP': 0.11,     # 英镑
        'HKD': 1.09,     # 港币
        'KRW': 180.0,    # 韩元
        'AUD': 0.21,     # 澳元
        'CAD': 0.19,     # 加元
        'SGD': 0.19,     # 新加坡元
        'CHF': 0.12,     # 瑞士法郎
        'NZD': 0.22,     # 新西兰元
        'RUB': 10.5,     # 俄罗斯卢布
        'INR': 11.8,     # 印度卢比
        'BRL': 0.78,     # 巴西雷亚尔
    }
    
    CURRENCY_NAMES = {
        'CNY': '人民币',
        'USD': '美元',
        'EUR': '欧元',
        'JPY': '日元',
        'GBP': '英镑',
        'HKD': '港币',
        'KRW': '韩元',
        'AUD': '澳元',
        'CAD': '加元',
        'SGD': '新加坡元',
        'CHF': '瑞士法郎',
        'NZD': '新西兰元',
        'RUB': '俄罗斯卢布',
        'INR': '印度卢比',
        'BRL': '巴西雷亚尔',
    }
    
    CURRENCY_SYMBOLS = {
        'CNY': '¥',
        'USD': '$',
        'EUR': '€',
        'JPY': '¥',
        'GBP': '£',
        'HKD': 'HK$',
        'KRW': '₩',
        'AUD': 'A$',
        'CAD': 'C$',
        'SGD': 'S$',
        'CHF': 'Fr',
        'NZD': 'NZ$',
        'RUB': '₽',
        'INR': '₹',
        'BRL': 'R$',
    }
    
    def __init__(self, root):
        self.root = root
        self.root.title("货币单位转换器")
        self.root.geometry("600x700")
        self.root.resizable(False, False)
        
        # 设置颜色主题
        self.colors = {
            'bg': '#f0f4f8',
            'primary': '#2c3e50',
            'secondary': '#3498db',
            'success': '#27ae60',
            'danger': '#e74c3c',
            'light': '#ecf0f1',
            'white': '#ffffff'
        }
        
        # 配置根窗口背景
        self.root.configure(bg=self.colors['bg'])
        
        # 创建界面
        self.create_widgets()
        
        # 绑定回车键
        self.root.bind('<Return>', lambda e: self.convert_currency())
        
    def create_widgets(self):
        """创建所有界面组件"""
        
        # 标题框架
        title_frame = tk.Frame(self.root, bg=self.colors['primary'], height=80)
        title_frame.pack(fill=tk.X, pady=(0, 20))
        title_frame.pack_propagate(False)
        
        # 标题
        title_label = tk.Label(
            title_frame,
            text="💱 货币单位转换器",
            font=('微软雅黑', 24, 'bold'),
            fg=self.colors['white'],
            bg=self.colors['primary']
        )
        title_label.pack(expand=True)
        
        # 主框架
        main_frame = tk.Frame(self.root, bg=self.colors['bg'])
        main_frame.pack(fill=tk.BOTH, expand=True, padx=30, pady=10)
        
        # ========== 金额输入区域 ==========
        amount_frame = tk.LabelFrame(
            main_frame,
            text="💰 输入金额",
            font=('微软雅黑', 12, 'bold'),
            bg=self.colors['bg'],
            fg=self.colors['primary'],
            padx=10,
            pady=10
        )
        amount_frame.pack(fill=tk.X, pady=(0, 15))
        
        # 金额输入框
        self.amount_var = tk.StringVar()
        amount_entry = tk.Entry(
            amount_frame,
            textvariable=self.amount_var,
            font=('Arial', 20),
            bg=self.colors['white'],
            fg=self.colors['primary'],
            relief=tk.FLAT,
            highlightthickness=2,
            highlightcolor=self.colors['secondary']
        )
        amount_entry.pack(fill=tk.X, ipady=8)
        amount_entry.focus()
        
        # 提示文字
        hint_label = tk.Label(
            amount_frame,
            text="提示：输入数字后按回车或点击转换按钮",
            font=('微软雅黑', 9),
            fg='#7f8c8d',
            bg=self.colors['bg']
        )
        hint_label.pack(anchor=tk.W, pady=(5, 0))
        
        # ========== 货币选择区域 ==========
        currency_frame = tk.Frame(main_frame, bg=self.colors['bg'])
        currency_frame.pack(fill=tk.X, pady=10)
        
        # 源货币
        from_frame = tk.LabelFrame(
            currency_frame,
            text="📤 从",
            font=('微软雅黑', 11, 'bold'),
            bg=self.colors['bg'],
            fg=self.colors['primary'],
            padx=10,
            pady=10
        )
        from_frame.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=(0, 10))
        
        self.from_currency = tk.StringVar(value='CNY')
        from_combo = ttk.Combobox(
            from_frame,
            textvariable=self.from_currency,
            values=list(self.CURRENCY_NAMES.keys()),
            font=('Arial', 12),
            state='readonly',
            height=20
        )
        from_combo.pack(fill=tk.X, ipady=5)
        
        # 显示货币名称
        self.from_name_label = tk.Label(
            from_frame,
            text='人民币',
            font=('微软雅黑', 10),
            fg='#7f8c8d',
            bg=self.colors['bg']
        )
        self.from_name_label.pack(anchor=tk.W, pady=(5, 0))
        
        # 目标货币
        to_frame = tk.LabelFrame(
            currency_frame,
            text="📥 到",
            font=('微软雅黑', 11, 'bold'),
            bg=self.colors['bg'],
            fg=self.colors['primary'],
            padx=10,
            pady=10
        )
        to_frame.pack(side=tk.RIGHT, fill=tk.X, expand=True, padx=(10, 0))
        
        self.to_currency = tk.StringVar(value='USD')
        to_combo = ttk.Combobox(
            to_frame,
            textvariable=self.to_currency,
            values=list(self.CURRENCY_NAMES.keys()),
            font=('Arial', 12),
            state='readonly',
            height=20
        )
        to_combo.pack(fill=tk.X, ipady=5)
        
        # 显示货币名称
        self.to_name_label = tk.Label(
            to_frame,
            text='美元',
            font=('微软雅黑', 10),
            fg='#7f8c8d',
            bg=self.colors['bg']
        )
        self.to_name_label.pack(anchor=tk.W, pady=(5, 0))
        
        # 绑定选择事件
        from_combo.bind('<<ComboboxSelected>>', self.update_currency_names)
        to_combo.bind('<<ComboboxSelected>>', self.update_currency_names)
        
        # ========== 转换按钮 ==========
        button_frame = tk.Frame(main_frame, bg=self.colors['bg'])
        button_frame.pack(fill=tk.X, pady=20)
        
        convert_btn = tk.Button(
            button_frame,
            text="🔄 转换",
            font=('微软雅黑', 14, 'bold'),
            bg=self.colors['secondary'],
            fg=self.colors['white'],
            relief=tk.FLAT,
            cursor='hand2',
            command=self.convert_currency
        )
        convert_btn.pack(fill=tk.X, ipady=12)
        
        # 悬停效果
        convert_btn.bind('<Enter>', lambda e: convert_btn.configure(bg='#2980b9'))
        convert_btn.bind('<Leave>', lambda e: convert_btn.configure(bg=self.colors['secondary']))
        
        # 交换按钮
        swap_btn = tk.Button(
            button_frame,
            text="⇄ 交换货币",
            font=('微软雅黑', 10),
            bg=self.colors['light'],
            fg=self.colors['primary'],
            relief=tk.FLAT,
            cursor='hand2',
            command=self.swap_currencies
        )
        swap_btn.pack(fill=tk.X, ipady=8, pady=(8, 0))
        
        swap_btn.bind('<Enter>', lambda e: swap_btn.configure(bg='#d5dbdb'))
        swap_btn.bind('<Leave>', lambda e: swap_btn.configure(bg=self.colors['light']))
        
        # ========== 结果显示区域 ==========
        result_frame = tk.LabelFrame(
            main_frame,
            text="📊 转换结果",
            font=('微软雅黑', 12, 'bold'),
            bg=self.colors['bg'],
            fg=self.colors['primary'],
            padx=15,
            pady=15
        )
        result_frame.pack(fill=tk.BOTH, expand=True, pady=(15, 0))
        
        # 结果标签
        self.result_var = tk.StringVar(value='等待转换...')
        result_label = tk.Label(
            result_frame,
            textvariable=self.result_var,
            font=('Arial', 24, 'bold'),
            fg=self.colors['primary'],
            bg=self.colors['bg'],
            wraplength=500
        )
        result_label.pack(expand=True, pady=10)
        
        # 汇率信息
        self.rate_var = tk.StringVar(value='')
        rate_label = tk.Label(
            result_frame,
            textvariable=self.rate_var,
            font=('微软雅黑', 10),
            fg='#7f8c8d',
            bg=self.colors['bg']
        )
        rate_label.pack(pady=(0, 10))
        
        # ========== 快捷转换按钮 ==========
        quick_frame = tk.Frame(main_frame, bg=self.colors['bg'])
        quick_frame.pack(fill=tk.X, pady=(15, 0))
        
        quick_label = tk.Label(
            quick_frame,
            text="⚡ 快速转换",
            font=('微软雅黑', 10, 'bold'),
            fg=self.colors['primary'],
            bg=self.colors['bg']
        )
        quick_label.pack(anchor=tk.W, pady=(0, 5))
        
        quick_buttons_frame = tk.Frame(quick_frame, bg=self.colors['bg'])
        quick_buttons_frame.pack(fill=tk.X)
        
        quick_pairs = [
            ('CNY→USD', 'CNY', 'USD'),
            ('USD→CNY', 'USD', 'CNY'),
            ('CNY→EUR', 'CNY', 'EUR'),
            ('EUR→CNY', 'EUR', 'CNY'),
            ('CNY→JPY', 'CNY', 'JPY'),
            ('JPY→CNY', 'JPY', 'CNY'),
        ]
        
        for i, (text, from_c, to_c) in enumerate(quick_pairs):
            btn = tk.Button(
                quick_buttons_frame,
                text=text,
                font=('微软雅黑', 9),
                bg=self.colors['light'],
                fg=self.colors['primary'],
                relief=tk.FLAT,
                cursor='hand2',
                command=lambda f=from_c, t=to_c: self.quick_convert(f, t)
            )
            btn.pack(side=tk.LEFT, padx=(0, 5), pady=2)
            btn.bind('<Enter>', lambda e, b=btn: b.configure(bg='#d5dbdb'))
            btn.bind('<Leave>', lambda e, b=btn: b.configure(bg=self.colors['light']))
        
        # ========== 底部信息 ==========
        footer_frame = tk.Frame(self.root, bg=self.colors['bg'])
        footer_frame.pack(fill=tk.X, pady=(10, 20))
        
        footer_label = tk.Label(
            footer_frame,
            text="汇率数据仅供参考 | 按 Enter 快速转换",
            font=('微软雅黑', 8),
            fg='#95a5a6',
            bg=self.colors['bg']
        )
        footer_label.pack()
        
    def update_currency_names(self, event=None):
        """更新货币名称显示"""
        from_curr = self.from_currency.get()
        to_curr = self.to_currency.get()
        
        self.from_name_label.config(
            text=self.CURRENCY_NAMES.get(from_curr, '')
        )
        self.to_name_label.config(
            text=self.CURRENCY_NAMES.get(to_curr, '')
        )
        
    def convert_currency(self):
        """执行货币转换"""
        try:
            # 获取输入金额
            amount_str = self.amount_var.get().strip()
            if not amount_str:
                self.result_var.set('⚠️ 请输入金额')
                self.rate_var.set('')
                return
            
            amount = float(amount_str)
            if amount < 0:
                self.result_var.set('⚠️ 金额不能为负数')
                self.rate_var.set('')
                return
            
            from_curr = self.from_currency.get()
            to_curr = self.to_currency.get()
            
            # 执行转换
            result = self.convert(amount, from_curr, to_curr)
            
            # 获取货币符号
            from_symbol = self.CURRENCY_SYMBOLS.get(from_curr, '')
            to_symbol = self.CURRENCY_SYMBOLS.get(to_curr, '')
            from_name = self.CURRENCY_NAMES.get(from_curr, '')
            to_name = self.CURRENCY_NAMES.get(to_curr, '')
            
            # 格式化显示
            self.result_var.set(
                f"{from_symbol}{amount:,.2f} {from_curr}\n"
                f"= {to_symbol}{result:,.2f} {to_curr}"
            )
            
            # 显示汇率
            rate = self.get_exchange_rate(from_curr, to_curr)
            self.rate_var.set(
                f"1 {from_curr} = {rate:.6f} {to_curr}  |  "
                f"1 {to_curr} = {1/rate:.6f} {from_curr}"
            )
            
        except ValueError:
            self.result_var.set('⚠️ 请输入有效的数字')
            self.rate_var.set('')
        except Exception as e:
            self.result_var.set('❌ 转换失败')
            self.rate_var.set(str(e))
    
    def convert(self, amount, from_currency, to_currency):
        """货币转换核心方法"""
        from_currency = from_currency.upper()
        to_currency = to_currency.upper()
        
        if from_currency not in self.EXCHANGE_RATES:
            raise ValueError("不支持的货币: " + from_currency)
        if to_currency not in self.EXCHANGE_RATES:
            raise ValueError("不支持的货币: " + to_currency)
        
        # 先转换为人民币（基准货币），再转换为目标货币
        amount_in_cny = amount / self.EXCHANGE_RATES[from_currency]
        converted_amount = amount_in_cny * self.EXCHANGE_RATES[to_currency]
        
        return round(converted_amount, 2)
    
    def get_exchange_rate(self, from_currency, to_currency):
        """获取汇率"""
        from_currency = from_currency.upper()
        to_currency = to_currency.upper()
        
        if from_currency not in self.EXCHANGE_RATES:
            raise ValueError("不支持的货币: " + from_currency)
        if to_currency not in self.EXCHANGE_RATES:
            raise ValueError("不支持的货币: " + to_currency)
        
        return self.EXCHANGE_RATES[to_currency] / self.EXCHANGE_RATES[from_currency]
    
    def swap_currencies(self):
        """交换源货币和目标货币"""
        from_curr = self.from_currency.get()
        to_curr = self.to_currency.get()
        
        self.from_currency.set(to_curr)
        self.to_currency.set(from_curr)
        
        self.update_currency_names()
        self.convert_currency()
    
    def quick_convert(self, from_curr, to_curr):
        """快速转换"""
        self.from_currency.set(from_curr)
        self.to_currency.set(to_curr)
        self.update_currency_names()
        self.convert_currency()


def main():
    """主函数"""
    root = tk.Tk()
    app = CurrencyConverterGUI(root)
    root.mainloop()


if __name__ == "__main__":
    main()