#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
REXMULTITRADE - Interface Gráfica
Gerencia múltiplas moedas com dashboard em tempo real
Compatible: Windows, Linux, MacOS
"""

import tkinter as tk
from tkinter import ttk, messagebox, scrolledtext
import subprocess
import json
import threading
import os
import sys
import time
from datetime import datetime
from pathlib import Path

# Configurações
BASE_DIR = Path(__file__).parent
CONFIG_FILE = BASE_DIR / 'configuracoes.json'
STATE_FILE = BASE_DIR / 'estado_robos.json'
LOG_FILE = BASE_DIR / 'logs' / 'log_trades.log'


class RexmultitradeGUI:
    """Interface Gráfica do REXMULTITRADE"""
    
    def __init__(self, root):
        # Criar diretório de logs se não existir
        (BASE_DIR / 'logs').mkdir(exist_ok=True)
        
        self.root = root
        self.root.title("REXMULTITRADE - Control Panel")
        self.root.geometry("1400x800")
        self.root.resizable(True, True)
        
        # Referência do processo
        self.robo_process = None
        self.is_running = False
        
        # Dados em cache
        self.config = {}
        self.estado = {}
        
        # Variáveis da UI
        self.log_autoscroll = tk.BooleanVar(value=True)
        
        # Criar interface
        self.create_styles()
        self.create_menu()
        self.create_widgets()
        self.load_config()
        self.start_update_loop()
        
        # Tratar fechamento
        self.root.protocol("WM_DELETE_WINDOW", self.on_closing)
    
    def create_styles(self):
        """Cria estilos personalizados"""
        style = ttk.Style()
        style.theme_use('clam')
        
        # Cores
        style.configure('Title.TLabel', font=('Helvetica', 14, 'bold'), foreground='#1e3c72')
        style.configure('Subtitle.TLabel', font=('Helvetica', 11, 'bold'), foreground='#2a5298')
        style.configure('Status.TLabel', font=('Helvetica', 10), foreground='#666')
        style.configure('Success.TLabel', foreground='#4caf50', font=('Helvetica', 10, 'bold'))
        style.configure('Error.TLabel', foreground='#f44336', font=('Helvetica', 10, 'bold'))
        
        # Buttons
        style.configure('Control.TButton', font=('Helvetica', 10))
        style.configure('Danger.TButton', font=('Helvetica', 10))
        style.configure('Success.TButton', font=('Helvetica', 10))
    
    def create_menu(self):
        """Cria menu superior"""
        menubar = tk.Menu(self.root)
        self.root.config(menu=menubar)
        
        # Menu Arquivo
        file_menu = tk.Menu(menubar, tearoff=0)
        menubar.add_cascade(label="Arquivo", menu=file_menu)
        file_menu.add_command(label="Recarregar Config", command=self.load_config)
        file_menu.add_command(label="Abrir Logs", command=self.open_logs)
        file_menu.add_separator()
        file_menu.add_command(label="Sair", command=self.on_closing)
        
        # Menu Ações
        action_menu = tk.Menu(menubar, tearoff=0)
        menubar.add_cascade(label="Ações", menu=action_menu)
        action_menu.add_command(label="Iniciar Robô", command=self.start_robo)
        action_menu.add_command(label="Parar Robô", command=self.stop_robo)
        action_menu.add_separator()
        action_menu.add_command(label="Limpar Logs", command=self.clear_logs)
        action_menu.add_command(label="Reset Estado", command=self.reset_estado)
        
        # Menu Ajuda
        help_menu = tk.Menu(menubar, tearoff=0)
        menubar.add_cascade(label="Ajuda", menu=help_menu)
        help_menu.add_command(label="Sobre", command=self.show_about)
        help_menu.add_command(label="Documentação", command=self.show_help)
    
    def create_widgets(self):
        """Cria widgets da interface"""
        
        # ===== FRAME SUPERIOR (Controles) =====
        top_frame = ttk.Frame(self.root)
        top_frame.pack(fill=tk.X, padx=10, pady=10)
        
        # Título
        title_label = ttk.Label(top_frame, text="🤖 REXMULTITRADE Control Panel", 
                               style='Title.TLabel')
        title_label.pack(side=tk.LEFT)
        
        # Status
        self.status_label = ttk.Label(top_frame, text="● Parado", style='Error.TLabel')
        self.status_label.pack(side=tk.RIGHT, padx=5)
        
        # ===== FRAME BOTÕES =====
        button_frame = ttk.Frame(self.root)
        button_frame.pack(fill=tk.X, padx=10, pady=5)
        
        # Botões de Controle
        btn_start = ttk.Button(button_frame, text="▶ Iniciar Robô", 
                              command=self.start_robo, style='Success.TButton', width=15)
        btn_start.pack(side=tk.LEFT, padx=5)
        
        btn_stop = ttk.Button(button_frame, text="⏹ Parar Robô", 
                             command=self.stop_robo, style='Danger.TButton', width=15)
        btn_stop.pack(side=tk.LEFT, padx=5)
        
        ttk.Separator(button_frame, orient=tk.VERTICAL).pack(side=tk.LEFT, fill=tk.Y, padx=10)
        
        btn_reload = ttk.Button(button_frame, text="🔄 Recarregar", 
                               command=self.load_config, width=12)
        btn_reload.pack(side=tk.LEFT, padx=5)
        
        btn_clear = ttk.Button(button_frame, text="🗑 Limpar Logs", 
                              command=self.clear_logs, width=12)
        btn_clear.pack(side=tk.LEFT, padx=5)
        
        # Checkbox autoscroll
        chk_autoscroll = ttk.Checkbutton(button_frame, text="Auto-scroll Logs",
                                        variable=self.log_autoscroll)
        chk_autoscroll.pack(side=tk.LEFT, padx=20)
        
        # ===== NOTEBOOK (Abas) =====
        notebook = ttk.Notebook(self.root)
        notebook.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
        
        # ABA 1: Dashboard
        self.create_dashboard_tab(notebook)
        
        # ABA 2: Logs
        self.create_logs_tab(notebook)
        
        # ABA 3: Configuração
        self.create_config_tab(notebook)
        
        # ABA 4: Estatísticas
        self.create_stats_tab(notebook)
        
        # ===== FRAME INFERIOR (Status Bar) =====
        bottom_frame = ttk.Frame(self.root)
        bottom_frame.pack(fill=tk.X, padx=10, pady=5, side=tk.BOTTOM)
        
        self.time_label = ttk.Label(bottom_frame, text="", style='Status.TLabel')
        self.time_label.pack(side=tk.LEFT)
        
        self.info_label = ttk.Label(bottom_frame, text="Pronto", style='Status.TLabel')
        self.info_label.pack(side=tk.RIGHT)
    
    def create_dashboard_tab(self, notebook):
        """Cria aba de Dashboard"""
        frame = ttk.Frame(notebook)
        notebook.add(frame, text="📊 Dashboard")
        
        # Canvas com scroll
        canvas = tk.Canvas(frame, height=400)
        scrollbar = ttk.Scrollbar(frame, orient=tk.VERTICAL, command=canvas.yview)
        scrollable_frame = ttk.Frame(canvas)
        
        scrollable_frame.bind(
            "<Configure>",
            lambda e: canvas.configure(scrollregion=canvas.bbox("all"))
        )
        
        canvas.create_window((0, 0), window=scrollable_frame, anchor="nw")
        canvas.configure(yscrollcommand=scrollbar.set)
        
        canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        
        # Frames para cada moeda
        self.moeda_frames = {}
        for moeda_config in self.config.get('moedas', []):
            symbol = moeda_config['symbol']
            self.moeda_frames[symbol] = self.create_moeda_card(scrollable_frame, moeda_config)
    
    def create_moeda_card(self, parent, moeda_config):
        """Cria card de moeda"""
        card = ttk.LabelFrame(parent, text=f"💹 {moeda_config['par']}", 
                             padding=10)
        card.pack(fill=tk.X, padx=5, pady=5)
        
        # Grid info
        info_frame = ttk.Frame(card)
        info_frame.pack(fill=tk.X)
        
        # Labels
        labels = {
            'capital': ('Capital:', '$ 0.00'),
            'ganho': ('Ganho Total:', '0.00%'),
            'take_profit': ('📊 Take Profit:', '0.00%'),
            'trades': ('Trades:', '0'),
            'posicao': ('Posição:', 'Fora'),
            'entrada': ('Entrada:', '$0.00000000')
        }
        
        symbol = moeda_config['symbol']
        self.moeda_frames[symbol] = {}
        
        col = 0
        for key, (label, default) in labels.items():
            # Label
            ttk.Label(info_frame, text=label, font=('Helvetica', 9, 'bold')).grid(
                row=0, column=col, sticky=tk.W, padx=5, pady=2)
            
            # Valor
            value_label = ttk.Label(info_frame, text=default, font=('Helvetica', 10))
            value_label.grid(row=1, column=col, sticky=tk.W, padx=5, pady=2)
            
            self.moeda_frames[symbol][key] = value_label
            col += 1
        
        return card
    
    def create_logs_tab(self, notebook):
        """Cria aba de Logs"""
        frame = ttk.Frame(notebook)
        notebook.add(frame, text="📋 Logs")
        
        # Text widget com scroll
        self.log_text = scrolledtext.ScrolledText(
            frame, height=20, width=80, font=('Courier', 9),
            bg='#f5f5f5', fg='#333'
        )
        self.log_text.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
        
        # Cores para diferentes tipos de log
        self.log_text.tag_config('info', foreground='#1565c0')
        self.log_text.tag_config('warning', foreground='#f57c00')
        self.log_text.tag_config('error', foreground='#c62828')
        self.log_text.tag_config('success', foreground='#2e7d32')
    
    def create_config_tab(self, notebook):
        """Cria aba de Configuração"""
        frame = ttk.Frame(notebook, padding=10)
        notebook.add(frame, text="⚙️ Configuração")
        
        # Treeview para moedas
        ttk.Label(frame, text="Moedas Configuradas:", style='Subtitle.TLabel').pack(anchor=tk.W)
        
        self.moedas_tree = ttk.Treeview(frame, columns=('Par', 'Capital', 'Agressividade'), 
                                        height=10)
        self.moedas_tree.pack(fill=tk.BOTH, expand=True, pady=5)
        
        self.moedas_tree.column('#0', width=50)
        self.moedas_tree.column('Par', width=150, heading='Par')
        self.moedas_tree.column('Capital', width=100, heading='Capital')
        self.moedas_tree.column('Agressividade', width=120, heading='Agressividade')
        
        # Botões
        button_frame = ttk.Frame(frame)
        button_frame.pack(fill=tk.X, pady=5)
        
        ttk.Button(button_frame, text="➕ Adicionar", 
                  command=self.add_moeda).pack(side=tk.LEFT, padx=5)
        ttk.Button(button_frame, text="✏️ Editar", 
                  command=self.edit_moeda).pack(side=tk.LEFT, padx=5)
        ttk.Button(button_frame, text="🗑 Remover", 
                  command=self.delete_moeda).pack(side=tk.LEFT, padx=5)
    
    def create_stats_tab(self, notebook):
        """Cria aba de Estatísticas"""
        frame = ttk.Frame(notebook, padding=10)
        notebook.add(frame, text="📈 Estatísticas")
        
        # Resumo geral
        ttk.Label(frame, text="Resumo Geral", style='Subtitle.TLabel').pack(anchor=tk.W)
        
        self.stats_frame = ttk.Frame(frame)
        self.stats_frame.pack(fill=tk.BOTH, expand=True, pady=10)
    
    # ===== MÉTODOS DE CONTROLE DO ROBÔ =====
    
    def start_robo(self):
        """Inicia o robô"""
        if self.is_running:
            messagebox.showwarning("Aviso", "Robô já está em execução!")
            return
        
        try:
            # Inicia subprocess
            self.robo_process = subprocess.Popen(
                [sys.executable, str(BASE_DIR / 'rexmultitrade.py')],
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE
            )
            
            self.is_running = True
            self.update_status_ui()
            self.info_label.config(text="✓ Robô iniciado com sucesso")
            messagebox.showinfo("Sucesso", "Robô de trading iniciado!")
            
        except Exception as e:
            messagebox.showerror("Erro", f"Erro ao iniciar robô:\n{str(e)}")
    
    def stop_robo(self):
        """Para o robô"""
        if not self.is_running or self.robo_process is None:
            messagebox.showwarning("Aviso", "Robô não está em execução!")
            return
        
        try:
            # Termina processo
            self.robo_process.terminate()
            
            # Aguarda encerramento
            try:
                self.robo_process.wait(timeout=5)
            except subprocess.TimeoutExpired:
                self.robo_process.kill()
            
            self.robo_process = None
            self.is_running = False
            self.update_status_ui()
            self.info_label.config(text="✓ Robô parado com sucesso")
            messagebox.showinfo("Sucesso", "Robô de trading parado!")
            
        except Exception as e:
            messagebox.showerror("Erro", f"Erro ao parar robô:\n{str(e)}")
    
    # ===== MÉTODOS DE CARREGAMENTO DE DADOS =====
    
    def load_config(self):
        """Carrega configuração"""
        try:
            if CONFIG_FILE.exists():
                with open(CONFIG_FILE, 'r', encoding='utf-8') as f:
                    self.config = json.load(f)
                
                self.update_moedas_tree()
                self.info_label.config(text="✓ Configuração carregada")
        except Exception as e:
            messagebox.showerror("Erro", f"Erro ao carregar config:\n{str(e)}")
    
    def load_estado(self):
        """Carrega estado do robô"""
        try:
            if STATE_FILE.exists():
                with open(STATE_FILE, 'r', encoding='utf-8') as f:
                    self.estado = json.load(f)
                
                self.update_dashboard()
                self.update_stats()
        except Exception as e:
            pass  # Silencioso se não encontrar
    
    def load_logs(self):
        """Carrega logs"""
        try:
            if LOG_FILE.exists():
                with open(LOG_FILE, 'r', encoding='utf-8') as f:
                    logs = f.read()
                
                self.log_text.config(state=tk.NORMAL)
                self.log_text.delete(1.0, tk.END)
                
                # Colorir logs
                for line in logs.split('\n'):
                    if 'ERROR' in line:
                        self.log_text.insert(tk.END, line + '\n', 'error')
                    elif 'WARNING' in line:
                        self.log_text.insert(tk.END, line + '\n', 'warning')
                    elif 'INFO' in line or 'VENDA' in line or 'COMPRA' in line:
                        self.log_text.insert(tk.END, line + '\n', 'info')
                    else:
                        self.log_text.insert(tk.END, line + '\n')
                
                self.log_text.config(state=tk.DISABLED)
                
                if self.log_autoscroll.get():
                    self.log_text.see(tk.END)
        except Exception as e:
            pass  # Silencioso
    
    # ===== MÉTODOS DE ATUALIZAÇÃO DA UI =====
    
    def update_status_ui(self):
        """Atualiza status visual"""
        if self.is_running:
            self.status_label.config(text="● Executando", style='Success.TLabel')
            self.info_label.config(text="Robô em execução")
        else:
            self.status_label.config(text="● Parado", style='Error.TLabel')
            self.info_label.config(text="Robô parado")
    
    def update_dashboard(self):
        """Atualiza dashboard com dados"""
        for symbol, dados in self.estado.get('robos', {}).items():
            if symbol in self.moeda_frames:
                frames = self.moeda_frames[symbol]
                
                # Atualizar dados
                frames['capital'].config(
                    text=f"$ {dados.get('capital_atual', 0):.2f}"
                )
                frames['ganho'].config(
                    text=f"{dados.get('ganho_percentual', 0):.2f}%"
                )
                frames['take_profit'].config(
                    text=f"{dados.get('ganho_medio_diario', 0):.2f}%"
                )
                frames['trades'].config(
                    text=str(dados.get('trades_realizados', 0))
                )
                frames['posicao'].config(
                    text="✓ Ativo" if dados.get('em_posicao') else "✗ Fora"
                )
                frames['entrada'].config(
                    text=f"$ {dados.get('preco_entrada', 0):.8f}"
                )
    
    def update_moedas_tree(self):
        """Atualiza Treeview de moedas"""
        # Limpar
        for item in self.moedas_tree.get_children():
            self.moedas_tree.delete(item)
        
        # Adicionar moedas
        for idx, moeda in enumerate(self.config.get('moedas', []), 1):
            self.moedas_tree.insert('', 'end', text=str(idx), 
                                   values=(moeda['par'], f"${moeda['capital']}", 
                                          f"{moeda['agressividade']*100:.0f}%"))
    
    def update_stats(self):
        """Atualiza estatísticas"""
        # Limpar frame anterior
        for widget in self.stats_frame.winfo_children():
            widget.destroy()
        
        total_capital = sum(m['capital'] for m in self.config.get('moedas', []))
        total_ganho = sum(d.get('ganho_total', 0) for d in self.estado.get('robos', {}).values())
        total_trades = sum(d.get('trades_realizados', 0) for d in self.estado.get('robos', {}).values())
        
        stats = [
            (f"Capital Total", f"$ {total_capital:.2f}"),
            (f"Ganho Total", f"$ {total_ganho:.2f}"),
            (f"Trades Realizados", f"{total_trades}"),
        ]
        
        for label, value in stats:
            row = ttk.Frame(self.stats_frame)
            row.pack(fill=tk.X, pady=5)
            ttk.Label(row, text=label, font=('Helvetica', 11)).pack(side=tk.LEFT)
            ttk.Label(row, text=value, font=('Helvetica', 11, 'bold'), 
                     foreground='#2a5298').pack(side=tk.RIGHT)
    
    # ===== MÉTODOS DE AÇÃO =====
    
    def add_moeda(self):
        """Adiciona nova moeda"""
        dialog = tk.Toplevel(self.root)
        dialog.title("Adicionar Moeda")
        dialog.geometry("400x350")
        dialog.transient(self.root)
        dialog.grab_set()
        
        # Par
        ttk.Label(dialog, text="Par (ex: BTC/USDT):").pack(padx=10, pady=5, anchor=tk.W)
        par_entry = ttk.Entry(dialog, width=30)
        par_entry.pack(padx=10, pady=5, fill=tk.X)
        
        # Symbol
        ttk.Label(dialog, text="Symbol (ex: BTCUSDT):").pack(padx=10, pady=5, anchor=tk.W)
        symbol_entry = ttk.Entry(dialog, width=30)
        symbol_entry.pack(padx=10, pady=5, fill=tk.X)
        
        # Capital
        ttk.Label(dialog, text="Capital (USD):").pack(padx=10, pady=5, anchor=tk.W)
        capital_entry = ttk.Entry(dialog, width=30)
        capital_entry.pack(padx=10, pady=5, fill=tk.X)
        capital_entry.insert(0, "100")
        
        # Agressividade
        ttk.Label(dialog, text="Agressividade (0.0-1.0):").pack(padx=10, pady=5, anchor=tk.W)
        agressividade_entry = ttk.Entry(dialog, width=30)
        agressividade_entry.pack(padx=10, pady=5, fill=tk.X)
        agressividade_entry.insert(0, "0.98")
        
        def save():
            try:
                novo_moeda = {
                    'par': par_entry.get().upper(),
                    'symbol': symbol_entry.get().upper(),
                    'capital': float(capital_entry.get()),
                    'capital_min': 5,
                    'agressividade': float(agressividade_entry.get()),
                    'ativo': True
                }
                
                self.config['moedas'].append(novo_moeda)
                
                with open(CONFIG_FILE, 'w', encoding='utf-8') as f:
                    json.dump(self.config, f, indent=2, ensure_ascii=False)
                
                self.load_config()
                dialog.destroy()
                messagebox.showinfo("Sucesso", "Moeda adicionada!")
            except Exception as e:
                messagebox.showerror("Erro", str(e))
        
        ttk.Button(dialog, text="Salvar", command=save).pack(padx=10, pady=10, fill=tk.X)
    
    def edit_moeda(self):
        """Edita moeda selecionada"""
        selection = self.moedas_tree.selection()
        if not selection:
            messagebox.showwarning("Aviso", "Selecione uma moeda!")
            return
        
        idx = int(self.moedas_tree.item(selection)['text']) - 1
        moeda = self.config['moedas'][idx]
        
        # Abrir dialog similar ao add
        messagebox.showinfo("Editar", "Edição em desenvolvimento")
    
    def delete_moeda(self):
        """Remove moeda"""
        selection = self.moedas_tree.selection()
        if not selection:
            messagebox.showwarning("Aviso", "Selecione uma moeda!")
            return
        
        if messagebox.askyesno("Confirmar", "Remover esta moeda?"):
            idx = int(self.moedas_tree.item(selection)['text']) - 1
            del self.config['moedas'][idx]
            
            with open(CONFIG_FILE, 'w', encoding='utf-8') as f:
                json.dump(self.config, f, indent=2, ensure_ascii=False)
            
            self.load_config()
            messagebox.showinfo("Sucesso", "Moeda removida!")
    
    def clear_logs(self):
        """Limpa logs"""
        if messagebox.askyesno("Confirmar", "Limpar todos os logs?"):
            try:
                LOG_FILE.write_text("")
                self.load_logs()
                messagebox.showinfo("Sucesso", "Logs limpos!")
            except Exception as e:
                messagebox.showerror("Erro", str(e))
    
    def reset_estado(self):
        """Reset estado"""
        if messagebox.askyesno("Confirmar", "⚠️ RESET DO ESTADO - Tem certeza?"):
            try:
                # Criar estado vazio
                estado_vazio = {
                    "timestamp_sincronizacao": 0,
                    "robos": {
                        m['symbol']: {
                            "capital_inicial": m['capital'],
                            "capital_atual": m['capital'],
                            "quantidade": 0,
                            "preco_entrada": 0,
                            "trades_realizados": 0,
                            "ganho_total": 0,
                            "ganho_percentual": 0,
                            "em_posicao": False,
                            "ganho_medio_diario": 0.5
                        }
                        for m in self.config.get('moedas', [])
                    }
                }
                
                with open(STATE_FILE, 'w', encoding='utf-8') as f:
                    json.dump(estado_vazio, f, indent=2, ensure_ascii=False)
                
                self.load_estado()
                messagebox.showinfo("Sucesso", "Estado resetado!")
            except Exception as e:
                messagebox.showerror("Erro", str(e))
    
    def open_logs(self):
        """Abre arquivo de logs no editor"""
        try:
            if sys.platform == 'linux':
                os.system(f"xdg-open {LOG_FILE}")
            elif sys.platform == 'darwin':  # MacOS
                os.system(f"open {LOG_FILE}")
            elif sys.platform == 'win32':  # Windows
                os.startfile(LOG_FILE)
        except Exception as e:
            messagebox.showerror("Erro", f"Erro ao abrir logs:\n{str(e)}")
    
    def show_about(self):
        """Mostra sobre"""
        messagebox.showinfo("Sobre", 
            "REXMULTITRADE v1.0\n\n"
            "Robô de Trading Híbrido\n\n"
            "Combina múltiplas moedas com análise de padrões\n"
            "Compatible: Windows, Linux, MacOS")
    
    def show_help(self):
        """Mostra help"""
        messagebox.showinfo("Ajuda",
            "REXMULTITRADE - Guia Rápido\n\n"
            "1. Configure moedas na aba Configuração\n"
            "2. Clique em 'Iniciar Robô'\n"
            "3. Monitore em tempo real no Dashboard\n"
            "4. Veja logs em 'Logs'\n\n"
            "📖 Documentação: README.md")
    
    # ===== LOOP DE ATUALIZAÇÃO =====
    
    def start_update_loop(self):
        """Inicia loop de atualização"""
        def update():
            try:
                # Verificar se processo ainda está rodando
                if self.robo_process is not None:
                    if self.robo_process.poll() is not None:
                        # Processo finalizou
                        self.is_running = False
                        self.robo_process = None
                        self.update_status_ui()
                
                # Carregar dados
                self.load_estado()
                self.load_logs()
                
                # Atualizar relógio
                self.time_label.config(text=f"🕐 {datetime.now().strftime('%H:%M:%S')}")
                
            except Exception as e:
                pass  # Silencioso
            
            # Próxima atualização em 2 segundos
            self.root.after(2000, update)
        
        update()
    
    def on_closing(self):
        """Ao fechar janela"""
        if self.is_running:
            if messagebox.askyesno("Sair", "Robô está em execução.\nDeseja parar antes de sair?"):
                self.stop_robo()
        
        self.root.destroy()


def main():
    """Função principal"""
    root = tk.Tk()
    app = RexmultitradeGUI(root)
    root.mainloop()


if __name__ == '__main__':
    main()
