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; }}
            .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 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>
                    
                    <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 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}"
    
    # Owner gets the email without attachment (or with? usually owner wants receipt too, but let's keep it simple as user asked for details in body)
    # User said: "owners email ... should have all the details ... and customers contact information"
    await loop.run_in_executor(executor, _send_sync, "irasmussenjobs@gmail.com", owner_subject, owner_html, attachment)
