import smtplib
import os
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import logging
from concurrent.futures import ThreadPoolExecutor
import asyncio
from email.mime.application import MIMEApplication

# Gmail SMTP Config
SMTP_SERVER = "smtp.gmail.com"
SMTP_PORT = 465 # SSL
SMTP_USER = os.getenv("SMTP_USER", "noreply@affordablehome-ac.com")
SMTP_PASSWORD = os.getenv("SMTP_PASSWORD")

logger = logging.getLogger("uvicorn.error")

executor = ThreadPoolExecutor(max_workers=3)

def _send_sync(to_email: str, subject: str, html_content: str, attachment: dict = None):
    if not SMTP_PASSWORD:
        logger.warning(f"SMTP_PASSWORD not set. Mock email to {to_email}")
        return

    msg = MIMEMultipart()
    msg["From"] = f"Affordable Home A/C <{SMTP_USER}>"
    msg["To"] = to_email
    msg["Subject"] = subject
    msg.attach(MIMEText(html_content, "html"))

    if attachment:
         part = MIMEApplication(attachment['content'], Name=attachment['filename'])
         part['Content-Disposition'] = f'attachment; filename="{attachment["filename"]}"'
         msg.attach(part)

    try:
        print(f"DEBUG: Connecting to SMTP {SMTP_SERVER}...")
        with smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT) as server:
            server.login(SMTP_USER, SMTP_PASSWORD)
            server.sendmail(SMTP_USER, to_email, msg.as_string())
        print(f"DEBUG: Email sent successfully to {to_email}")
        logger.info(f"Email sent to {to_email}")
    except Exception as e:
        print(f"DEBUG: SMTP Failed: {e}")
        logger.error(f"Failed to send email to {to_email}: {e}")

# --- TEMPLATES ---

def get_customer_template(order_id, total_cents):
    return f"""
    <!DOCTYPE html>
    <html>
    <head>
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <style>
            body {{ margin: 0; padding: 0; background-color: #0a0e14; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; }}
            .container {{ max-width: 600px; margin: 0 auto; background-color: #0a0e14; color: #e2e8f0; }}
            .header {{ background: linear-gradient(135deg, #0f1621 0%, #1a2233 100%); padding: 40px 30px; border-bottom: 2px solid #222; text-align: center; }}
            .logo-text {{ color: #ffffff; font-weight: 800; font-size: 24px; text-transform: uppercase; letter-spacing: 2px; }}
            .accent {{ color: #f43f5e; }}
            .content {{ padding: 40px 30px; }}
            .status-badge {{ display: inline-block; padding: 8px 16px; background-color: rgba(6, 182, 212, 0.1); border: 1px solid rgba(6, 182, 212, 0.3); color: #22d3ee; border-radius: 50px; font-size: 12px; font-weight: 700; letter-spacing: 1px; text-transform: uppercase; margin-bottom: 30px; }}
            .order-title {{ font-size: 32px; font-weight: 800; margin: 0 0 10px 0; letter-spacing: -1px; color: #fff; }}
            .order-subtitle {{ font-size: 16px; color: #94a3b8; margin: 0 0 40px 0; line-height: 1.6; }}
            .card {{ background-color: #111827; border: 1px solid #374151; border-radius: 16px; padding: 30px; margin-bottom: 30px; }}
            .card-label {{ font-size: 11px; text-transform: uppercase; letter-spacing: 2px; color: #6b7280; font-weight: 600; margin-bottom: 12px; }}
            .order-id {{ font-size: 24px; font-weight: 700; color: #fff; letter-spacing: 2px; font-family: monospace; }}
            .total-amount {{ font-size: 36px; font-weight: 700; color: #f43f5e; margin-top: 5px; }}
            .btn {{ display: block; width: 100%; background: linear-gradient(90deg, #f43f5e 0%, #e11d48 100%); color: #ffffff; text-decoration: none; padding: 18px 0; border-radius: 12px; font-weight: 700; text-align: center; text-transform: uppercase; letter-spacing: 1px; margin: 30px 0; transition: opacity 0.2s; }}
            .btn:hover {{ opacity: 0.9; }}
            .steps {{ margin: 0 0 40px 0; padding: 0; list-style: none; }}
            .step-item {{ display: flex; gap: 20px; margin-bottom: 25px; align-items: flex-start; }}
            .step-num {{ width: 32px; height: 32px; background-color: #f43f5e; color: white; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 700; flex-shrink: 0; font-size: 14px; }}
            .step-text h4 {{ margin: 0 0 5px 0; color: #fff; font-size: 16px; }}
            .step-text p {{ margin: 0; color: #94a3b8; font-size: 14px; line-height: 1.5; }}
            .warning-box {{ background-color: rgba(244, 63, 94, 0.05); border: 1px solid rgba(244, 63, 94, 0.2); border-radius: 12px; padding: 20px; text-align: center; margin-bottom: 30px; }}
            .warning-title {{ color: #f43f5e; font-weight: 700; font-size: 12px; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 10px; display: flex; align-items: center; justify-content: center; gap: 8px; }}
            .warning-text {{ color: #fca5a5; font-size: 11px; line-height: 1.6; text-transform: uppercase; letter-spacing: 1px; font-weight: 600; }}
            .info-box {{ background-color: #1f2937; border-radius: 12px; padding: 20px; margin-bottom: 20px; text-align: left; }}
            .info-title {{ color: #22d3ee; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 8px; }}
            .info-text {{ color: #94a3b8; font-size: 13px; line-height: 1.5; }}
            .footer {{ border-top: 1px solid #333; padding: 40px 30px; text-align: center; color: #6b7280; font-size: 12px; background-color: #0d1117; }}
            .footer-links {{ margin-bottom: 20px; }}
            .footer-links a {{ color: #94a3b8; text-decoration: none; margin: 0 10px; }}
        </style>
    </head>
    <body>
        <div class="container">
            <div class="header">
                <div class="logo-text">Affordable <span class="accent">Home A/C</span></div>
            </div>
            
            <div class="content">
                <div style="text-align: center;">
                    <span class="status-badge">Payment Confirmed</span>
                    
                    <h1 class="order-title">You're All Set!</h1>
                    <p class="order-subtitle">Mahalo for choosing Affordable Home A/C. Your order has been secured and is ready for the next step.</p>
                </div>

                <div class="card">
                    <div style="display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 25px;">
                        <div>
                            <div class="card-label">Order Number</div>
                            <div class="order-id">{order_id}</div>
                        </div>
                    </div>
                    <div>
                        <div class="card-label">Total Amount Paid</div>
                        <div class="total-amount">${total_cents / 100:.2f}</div>
                    </div>
                </div>

                <div class="info-box">
                    <div class="info-title">Deployment Protocol</div>
                    <div class="info-text">
                        Once your order is processed, an Affordable Home A/C logistics coordinator will contact you to schedule a specific arrival/pickup window.
                    </div>
                </div>

                <div style="margin: 40px 0;">
                    <h3 style="color: #fff; font-size: 18px; margin-bottom: 25px;">Seamless Fulfillment Guide</h3>
                    
                    <div class="steps">
                        <div class="step-item">
                            <div class="step-num">1</div>
                            <div class="step-text">
                                <h4>Prepare for Pickup</h4>
                                <p>Please have this email ready (digital copy is fine) along with a valid government-issued ID matching the order name.</p>
                            </div>
                        </div>
                        <div class="step-item">
                            <div class="step-num">2</div>
                            <div class="step-text">
                                <h4>Head to Distribution Center</h4>
                                <p>We are located in Waipahu. Our team will assist you with loading your unit.</p>
                            </div>
                        </div>
                    </div>
                </div>

                <div class="card" style="border-color: #f43f5e;">
                    <div class="card-label" style="color: #f43f5e;">Pickup Location</div>
                    <p style="color: #fff; font-size: 16px; margin: 10px 0 5px 0; font-weight: 500;">Waipahu Distribution Center</p>
                    <p style="color: #94a3b8; margin: 0 0 20px 0; font-size: 14px;">94-150 Leoleo St #203<br>Waipahu, HI 96797</p>
                    
                    <div class="warning-box" style="background: rgba(255,165,0,0.1); border-color: rgba(255,165,0,0.3); margin-top: 15px; margin-bottom: 15px;">
                        <div class="warning-title" style="color: #fbbf24;">
                            Active Distribution Hub
                        </div>
                        <div class="warning-text" style="color: #fbbf24; text-transform: none;">
                            Unscheduled arrivals cannot be accommodated. Please wait for your confirmation.
                        </div>
                    </div>
                    
                    <a href="https://www.google.com/maps/search/?api=1&query=94-150+Leoleo+Street+203,+Waipahu,+HI+96797" 
                       class="btn" style="margin: 0; display: inline-block; width: auto; padding: 12px 30px; font-size: 14px;">
                        Get Directions
                    </a>
                </div>

                <div class="warning-box">
                    <div class="warning-title">All Sales Final</div>
                    <div class="warning-text">
                        No Refunds • No Exchanges<br>
                        All warranty claims & defective units must be processed directly through the manufacturer.
                    </div>
                </div>

                <div style="text-align: center; margin-top: 40px; padding: 20px; background: #111827; border-radius: 12px;">
                    <p style="color: #94a3b8; font-size: 14px; margin-bottom: 10px;">Questions or concerns?</p>
                    <p style="color: #fff; font-weight: 600; margin: 0;">(808) 488-1111</p>
                    <p style="color: #22d3ee; margin: 5px 0 0 0; font-size: 14px;">support@affordablehome-ac.com</p>
                </div>
            </div>

            <div class="footer">
                <div class="footer-links">
                    <a href="#">Terms of Service</a> &bull; 
                    <a href="#">Return Policy</a> &bull; 
                    <a href="#">Privacy</a>
                </div>
                <p>&copy; 2024 Affordable Home A/C, LLC. All rights reserved.</p>
                <p style="margin-top: 10px; color: #4b5563;">
                    DISCLAIMER: All sales are final pending inspection at pickup. <br>
                    Please verify unit specifications before leaving the warehouse.
                </p>
            </div>
        </div>
    </body>
    </html>
    """

def get_owner_template(order_id, total_cents, customer_email):
    return f"""
    <!DOCTYPE html>
    <html>
    <head>
        <style>
            body {{ font-family: monospace; background: #000; color: #0f0; padding: 20px; }}
            .alert {{ border: 2px solid #0f0; padding: 20px; max-width: 600px; margin: 0 auto; }}
            h1 {{ margin-top: 0; text-transform: uppercase; }}
            .field {{ margin-bottom: 15px; }}
            .label {{ color: #008000; font-weight: bold; }}
            .value {{ color: #fff; font-size: 1.2em; }}
        </style>
    </head>
    <body>
        <div class="alert">
            <h1>[NEW ORDER ALERT]</h1>
            <div class="field">
                <div class="label">ORDER ID:</div>
                <div class="value">{order_id}</div>
            </div>
            <div class="field">
                <div class="label">CUSTOMER EMAIL:</div>
                <div class="value">{customer_email}</div>
            </div>
            <div class="field">
                <div class="label">TOTAL VALUE:</div>
                <div class="value">${total_cents / 100:.2f}</div>
            </div>
            <hr style="border-color: #0f0;">
            <p>Please log in to the admin dashboard for full item manifest and customer details.</p>
        </div>
    </body>
    </html>
    """

async def send_order_confirmation(to_email: str, order_id: str, total_cents: int, pdf_bytes: bytes = None):
    """
    Sends order confirmation email asynchronously.
    """
    subject = f"Order Confirmation"
    
    # 1. Send to Customer (Premium Template)
    customer_html = get_customer_template(order_id, total_cents)
    
    # Attachment only goes to customer for now
    attachment = None
    if pdf_bytes:
        attachment = {
            "filename": f"Receipt_{order_id[-8:].upper()}.pdf",
            "content": pdf_bytes
        }

    loop = asyncio.get_event_loop()
    await loop.run_in_executor(executor, _send_sync, to_email, subject, customer_html, attachment)

    # 2. Send to Owner (Admin Template)
    owner_html = get_owner_template(order_id, total_cents, to_email)
    owner_subject = f"[NEW ORDER] {order_id[-8:].upper()} - {to_email}"
    
    await loop.run_in_executor(executor, _send_sync, "irasmussenjobs@gmail.com", owner_subject, owner_html, attachment)
