import asyncio
import os
import gradio as gr

# Setup Playwright environment in writable cloud folder
os.environ["PLAYWRIGHT_BROWSERS_PATH"] = "/tmp/pw-browsers"
os.system("python -m playwright install chromium")

from playwright.async_api import async_playwright


async def process_subscriptions(email, domains_text, progress=gr.Progress()):
    if not email or not domains_text.strip():
        return "Error: Please enter Email and Domains!"

    domains = [
        d.strip() for d in domains_text.strip().split("\n") if d.strip()
    ]
    logs = []
    logs.append(
        f"Starting One-by-One Automation for {len(domains)} domains...\n"
    )

    async with async_playwright() as p:
        browser = await p.chromium.launch(
            headless=True, args=["--no-sandbox", "--disable-setuid-sandbox"]
        )
        context = await browser.new_context(
            user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
        )

        for idx, domain in enumerate(domains):
            url = domain if domain.startswith("http") else f"https://{domain}"

            progress(
                (idx) / len(domains),
                desc=f"[{idx+1}/{len(domains)}] Processing {url}",
            )
            logs.append(f"[{idx+1}/{len(domains)}] Opening: {url}")

            page = await context.new_page()

            try:
                await page.goto(
                    url, wait_until="domcontentloaded", timeout=30000
                )
                logs.append("  Waiting 3s for popups and forms...")
                await asyncio.sleep(3)

                email_selectors = [
                    'input[type="email"]',
                    'input[name*="email" i]',
                    'input[placeholder*="email" i]',
                    'input[id*="email" i]',
                    'input[class*="email" i]',
                    'input[placeholder*="subscribe" i]',
                ]

                email_field = None
                for selector in email_selectors:
                    try:
                        element = page.locator(selector).first
                        if await element.is_visible():
                            email_field = element
                            break
                    except Exception:
                        continue

                if email_field:
                    await email_field.fill(email)
                    await asyncio.sleep(1)
                    await email_field.press("Enter")
                    logs.append("  [SUCCESS] Subscribed successfully!")
                    await asyncio.sleep(3)
                else:
                    logs.append(
                        "  [FAILED] No visible email subscription box found."
                    )

            except Exception as e:
                logs.append("  [SKIPPED] Site was slow or unreachable.")

            finally:
                await page.close()

            logs.append("-" * 40)

        await browser.close()

    logs.append("\nAll websites processed one by one!")
    return "\n".join(logs)


with gr.Blocks(title="Sequential Email Subscriber Bot") as app:
    gr.Markdown("# Bulk Domain Email Subscriber Bot")

    with gr.Row():
        with gr.Column():
            email_input = gr.Textbox(
                label="Your Email Address",
                placeholder="example@gmail.com",
                type="email",
            )
            domains_input = gr.Textbox(
                label="Enter Domain Names (One per line)",
                placeholder="site1.com\nsite2.com\nsite3.com",
                lines=8,
            )
            submit_btn = gr.Button("Start Subscribing", variant="primary")

        with gr.Column():
            output_logs = gr.Textbox(
                label="Live Status Logs", lines=15, interactive=False
            )

    submit_btn.click(
        fn=process_subscriptions,
        inputs=[email_input, domains_input],
        outputs=output_logs,
    )

if __name__ == "__main__":
    app.launch()