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

API_KEY = "b872fcef-1290-4a84-94a7-a1a50a77d0c9"
BASE_URL = "https://api.mails.so/v1"

class EmailValidatorApp:
    def __init__(self, root):
        self.root = root
        self.root.title("📧 Email Validator - Desktop")
        self.root.geometry("900x700")
        self.root.configure(bg='#1a1a1a')

        self.stats = {"total": 0, "valid": 0, "invalid": 0}
        self.history = []

        self.setup_ui()

    def setup_ui(self):
        # Header
        header_frame = tk.Frame(self.root, bg='#2a2a2a', pady=15)
        header_frame.pack(fill=tk.X, padx=10, pady=10)

        title_label = tk.Label(
            header_frame,
            text="📧 Email Validator",
            font=('SF Mono', 20, 'bold'),
            bg='#2a2a2a',
            fg='#0ea5e9'
        )
        title_label.pack()

        subtitle_label = tk.Label(
            header_frame,
            text="Powered by mails.so API",
            font=('SF Mono', 10),
            bg='#2a2a2a',
            fg='#a0a0a0'
        )
        subtitle_label.pack()

        # Stats frame
        stats_frame = tk.Frame(self.root, bg='#1a1a1a')
        stats_frame.pack(fill=tk.X, padx=10, pady=5)

        self.stat_labels = {}
        stats_config = [
            ("Total", "total", "#ffffff"),
            ("Válidos", "valid", "#10b981"),
            ("Inválidos", "invalid", "#ef4444"),
            ("Taxa", "rate", "#0ea5e9")
        ]

        for i, (name, key, color) in enumerate(stats_config):
            stat_card = tk.Frame(stats_frame, bg='#2a2a2a', padx=15, pady=10)
            stat_card.grid(row=0, column=i, padx=5, sticky='ew')
            stats_frame.grid_columnconfigure(i, weight=1)

            value_label = tk.Label(
                stat_card,
                text="0" if key != "rate" else "0%",
                font=('SF Mono', 18, 'bold'),
                bg='#2a2a2a',
                fg=color
            )
            value_label.pack()

            name_label = tk.Label(
                stat_card,
                text=name,
                font=('SF Mono', 9),
                bg='#2a2a2a',
                fg='#a0a0a0'
            )
            name_label.pack()

            self.stat_labels[key] = value_label

        # Main content frame
        content_frame = tk.Frame(self.root, bg='#1a1a1a')
        content_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)

        # Left panel - Input
        input_frame = tk.Frame(content_frame, bg='#2a2a2a', padx=15, pady=15)
        input_frame.grid(row=0, column=0, sticky='nsew', padx=(0, 5))
        content_frame.grid_columnconfigure(0, weight=1)
        content_frame.grid_rowconfigure(0, weight=1)

        input_label = tk.Label(
            input_frame,
            text="📝 Entrada de Emails",
            font=('SF Mono', 12, 'bold'),
            bg='#2a2a2a',
            fg='#0ea5e9'
        )
        input_label.pack(anchor='w', pady=(0, 10))

        # Mode selector
        mode_frame = tk.Frame(input_frame, bg='#2a2a2a')
        mode_frame.pack(fill=tk.X, pady=(0, 10))

        self.mode_var = tk.StringVar(value="single")

        single_btn = tk.Radiobutton(
            mode_frame,
            text="1 Email",
            variable=self.mode_var,
            value="single",
            font=('SF Mono', 10),
            bg='#2a2a2a',
            fg='#ffffff',
            selectcolor='#0ea5e9',
            command=self.update_placeholder
        )
        single_btn.pack(side=tk.LEFT, padx=5)

        batch_btn = tk.Radiobutton(
            mode_frame,
            text="Múltiplos",
            variable=self.mode_var,
            value="batch",
            font=('SF Mono', 10),
            bg='#2a2a2a',
            fg='#ffffff',
            selectcolor='#0ea5e9',
            command=self.update_placeholder
        )
        batch_btn.pack(side=tk.LEFT, padx=5)

        # Input text area
        self.input_text_area = scrolledtext.ScrolledText(
            input_frame,
            height=12,
            width=40,
            font=('SF Mono', 10),
            bg='#1a1a1a',
            fg='#ffffff',
            insertbackground='#ffffff',
            relief=tk.FLAT,
            padx=10,
            pady=10
        )
        self.input_text_area.pack(fill=tk.BOTH, expand=True, pady=(0, 10))

        self.hint_label = tk.Label(
            input_frame,
            text="💡 Digite um email",
            font=('SF Mono', 9),
            bg='#2a2a2a',
            fg='#a0a0a0'
        )
        self.hint_label.pack(anchor='w', pady=(0, 10))

        # Buttons
        btn_frame = tk.Frame(input_frame, bg='#2a2a2a')
        btn_frame.pack(fill=tk.X)

        validate_btn = tk.Button(
            btn_frame,
            text="🔍 Validar",
            command=self.validate_emails,
            font=('SF Mono', 11, 'bold'),
            bg='#0ea5e9',
            fg='#ffffff',
            relief=tk.FLAT,
            padx=20,
            pady=10,
            cursor='hand2'
        )
        validate_btn.pack(fill=tk.X, pady=(0, 5))

        clear_btn = tk.Button(
            btn_frame,
            text="🗑️ Limpar",
            command=self.clear_input,
            font=('SF Mono', 10),
            bg='#3a3a3a',
            fg='#ffffff',
            relief=tk.FLAT,
            padx=20,
            pady=8,
            cursor='hand2'
        )
        clear_btn.pack(fill=tk.X)

        # Right panel - Results
        results_frame = tk.Frame(content_frame, bg='#2a2a2a', padx=15, pady=15)
        results_frame.grid(row=0, column=1, sticky='nsew', padx=(5, 0))
        content_frame.grid_columnconfigure(1, weight=1)

        results_header = tk.Frame(results_frame, bg='#2a2a2a')
        results_header.pack(fill=tk.X, pady=(0, 10))

        results_label = tk.Label(
            results_header,
            text="📊 Resultados",
            font=('SF Mono', 12, 'bold'),
            bg='#2a2a2a',
            fg='#0ea5e9'
        )
        results_label.pack(side=tk.LEFT)

        export_btn = tk.Button(
            results_header,
            text="💾 Exportar",
            command=self.export_results,
            font=('SF Mono', 9),
            bg='#3a3a3a',
            fg='#ffffff',
            relief=tk.FLAT,
            padx=15,
            pady=5,
            cursor='hand2'
        )
        export_btn.pack(side=tk.RIGHT)

        # Results text area
        self.results_text_area = scrolledtext.ScrolledText(
            results_frame,
            height=20,
            width=50,
            font=('SF Mono', 9),
            bg='#1a1a1a',
            fg='#ffffff',
            insertbackground='#ffffff',
            relief=tk.FLAT,
            padx=10,
            pady=10,
            state=tk.DISABLED
        )
        self.results_text_area.pack(fill=tk.BOTH, expand=True)

        # Configure text tags for colored output
        self.results_text_area.tag_configure("valid", foreground="#10b981")
        self.results_text_area.tag_configure("invalid", foreground="#ef4444")
        self.results_text_area.tag_configure("header", foreground="#0ea5e9", font=('SF Mono', 10, 'bold'))
        self.results_text_area.tag_configure("email", foreground="#ffffff", font=('SF Mono', 10, 'bold'))

        self.show_empty_state()

    def update_placeholder(self):
        mode = self.mode_var.get()
        if mode == "single":
            self.hint_label.config(text="💡 Digite um email")
        else:
            self.hint_label.config(text="💡 Um email por linha (até 100)")

    def clear_input(self):
        self.input_text_area.delete("1.0", tk.END)
        self.input_text_area.focus()

    def show_empty_state(self):
        self.results_text_area.config(state=tk.NORMAL)
        self.results_text_area.delete("1.0", tk.END)
        self.results_text_area.insert(tk.END, "\n\n\n")
        self.results_text_area.insert(tk.END, "         📭\n\n", "header")
        self.results_text_area.insert(tk.END, "  Nenhuma validação realizada\n\n")
        self.results_text_area.insert(tk.END, "  Digite um email e clique em 'Validar'")
        self.results_text_area.config(state=tk.DISABLED)

    def validate_emails(self):
        input_text = self.input_text_area.get("1.0", tk.END).strip()

        if not input_text:
            messagebox.showerror("Erro", "Por favor, digite ao menos um email")
            return

        emails = [e.strip() for e in input_text.splitlines() if e.strip()]

        if not emails:
            messagebox.showerror("Erro", "Nenhum email válido encontrado")
            return

        self.show_loading()
        self.root.update()

        try:
            if len(emails) == 1:
                result = self.validate_single(emails[0])
                self.display_single_result(result, emails[0])
            else:
                result = self.validate_batch(emails)
                self.display_batch_results(result)

            self.history.append({
                "timestamp": datetime.now().isoformat(),
                "emails": emails,
                "result": result
            })

            self.update_stats()

        except Exception as e:
            messagebox.showerror("Erro", f"Erro ao validar: {str(e)}")
            self.show_empty_state()

    def validate_single(self, email):
        url = f"{BASE_URL}/validate"
        headers = {"x-mails-api-key": API_KEY}
        params = {"email": email}

        response = requests.get(url, headers=headers, params=params, timeout=10)
        response.raise_for_status()
        return response.json()

    def validate_batch(self, emails):
        url = f"{BASE_URL}/batch"
        headers = {
            "x-mails-api-key": API_KEY,
            "Content-Type": "application/json"
        }
        data = {"emails": emails}

        response = requests.post(url, headers=headers, json=data, timeout=30)
        response.raise_for_status()
        return response.json()

    def display_single_result(self, result, email):
        self.results_text_area.config(state=tk.NORMAL)
        self.results_text_area.delete("1.0", tk.END)

        # Parse result
        data = result.get("data", {})
        is_valid = data.get("isv_format") and data.get("isv_domain")

        # Update stats
        self.stats["total"] += 1
        if is_valid:
            self.stats["valid"] += 1
        else:
            self.stats["invalid"] += 1

        # Display
        status_tag = "valid" if is_valid else "invalid"
        status_text = "✓ VÁLIDO" if is_valid else "✗ INVÁLIDO"

        self.results_text_area.insert(tk.END, f"Email: ", "header")
        self.results_text_area.insert(tk.END, f"{email}\n\n", "email")
        self.results_text_area.insert(tk.END, f"Status: {status_text}\n\n", status_tag)
        self.results_text_area.insert(tk.END, "Detalhes:\n", "header")
        self.results_text_area.insert(tk.END, json.dumps(data, indent=2, ensure_ascii=False))

        self.results_text_area.config(state=tk.DISABLED)

    def display_batch_results(self, results):
        self.results_text_area.config(state=tk.NORMAL)
        self.results_text_area.delete("1.0", tk.END)

        data_list = results.get("data", [])

        for i, data in enumerate(data_list, 1):
            email = data.get("email", "N/A")
            is_valid = data.get("isv_format") and data.get("isv_domain")

            # Update stats
            self.stats["total"] += 1
            if is_valid:
                self.stats["valid"] += 1
            else:
                self.stats["invalid"] += 1

            status_tag = "valid" if is_valid else "invalid"
            status_text = "✓ VÁLIDO" if is_valid else "✗ INVÁLIDO"

            self.results_text_area.insert(tk.END, f"━━━━━━━━━━━━━━━━━━━━━━━━━━━\n", "header")
            self.results_text_area.insert(tk.END, f"Email #{i}: ", "header")
            self.results_text_area.insert(tk.END, f"{email}\n", "email")
            self.results_text_area.insert(tk.END, f"Status: {status_text}\n\n", status_tag)

        self.results_text_area.insert(tk.END, f"\n\n✓ {len(data_list)} emails validados", "header")
        self.results_text_area.config(state=tk.DISABLED)

    def show_loading(self):
        self.results_text_area.config(state=tk.NORMAL)
        self.results_text_area.delete("1.0", tk.END)
        self.results_text_area.insert(tk.END, "\n\n\n")
        self.results_text_area.insert(tk.END, "         ⏳\n\n", "header")
        self.results_text_area.insert(tk.END, "    Validando emails...\n")
        self.results_text_area.insert(tk.END, "    Por favor, aguarde...")
        self.results_text_area.config(state=tk.DISABLED)

    def update_stats(self):
        self.stat_labels["total"].config(text=str(self.stats["total"]))
        self.stat_labels["valid"].config(text=str(self.stats["valid"]))
        self.stat_labels["invalid"].config(text=str(self.stats["invalid"]))

        rate = 0
        if self.stats["total"] > 0:
            rate = round((self.stats["valid"] / self.stats["total"]) * 100)
        self.stat_labels["rate"].config(text=f"{rate}%")

    def export_results(self):
        if not self.history:
            messagebox.showwarning("Aviso", "Nenhum resultado para exportar")
            return

        filename = f"email-validation-{datetime.now().strftime('%Y%m%d-%H%M%S')}.json"

        try:
            with open(filename, 'w', encoding='utf-8') as f:
                json.dump(self.history, f, indent=2, ensure_ascii=False)

            messagebox.showinfo("Sucesso", f"Resultados exportados para:\n{filename}")
        except Exception as e:
            messagebox.showerror("Erro", f"Erro ao exportar: {str(e)}")


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