#!/usr/bin/env python3
"""
KeluargaMart SMTP Diagnostic & Testing Tool
Usage:
    python3 scripts/test-smtp.py --to user@example.com
    python3 scripts/test-smtp.py --host smtp.gmail.com --port 587 --user myemail@gmail.com --pass "app-password" --to user@example.com
"""

import sys
import os
import argparse
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

def load_env(env_path):
    env_vars = {}
    if os.path.exists(env_path):
        with open(env_path, "r") as f:
            for line in f:
                line = line.strip()
                if line and not line.startswith("#") and "=" in line:
                    key, val = line.split("=", 1)
                    env_vars[key.strip()] = val.strip().strip("\"'")
    return env_vars

def main():
    parser = argparse.ArgumentParser(description="Test KeluargaMart SMTP Configuration")
    parser.add_argument("--host", help="SMTP Host (e.g. smtp.gmail.com)")
    parser.add_argument("--port", type=int, help="SMTP Port (default: 587)")
    parser.add_argument("--user", help="SMTP Username / Email")
    parser.add_argument("--pass", dest="password", help="SMTP Password / App Password")
    parser.add_argument("--from", dest="from_email", help="Sender email address")
    parser.add_argument("--to", required=True, help="Recipient email address to receive test email")

    args = parser.parse_args()

    # Load from environment file if not passed
    env_file = os.path.join(os.path.dirname(__file__), "../infra/containers/.env")
    env = load_env(env_file)

    host = args.host or env.get("SMTP_HOST") or os.environ.get("SMTP_HOST")
    port = args.port or int(env.get("SMTP_PORT") or os.environ.get("SMTP_PORT") or 587)
    user = args.user or env.get("SMTP_USER") or os.environ.get("SMTP_USER")
    password = args.password or env.get("SMTP_PASS") or os.environ.get("SMTP_PASS")
    from_email = args.from_email or env.get("SMTP_FROM") or os.environ.get("SMTP_FROM") or user

    print("==================================================")
    print("  KeluargaMart SMTP Connection & Email Test")
    print("==================================================")
    print(f"• Target Host  : {host if host else '[KOSONG / BELUM DIKONFIGURASI]'}")
    print(f"• Port         : {port}")
    print(f"• User / Auth  : {user if user else '[KOSONG]'}")
    print(f"• Sender From  : {from_email if from_email else '[KOSONG]'}")
    print(f"• Recipient To : {args.to}")
    print("==================================================")

    if not host:
        print("\n❌ GAGAL: SMTP_HOST belum diatur!")
        print("Silakan tentukan host SMTP dengan flag --host atau isi di infra/containers/.env")
        print("\nContoh penggunaan:")
        print('  python3 scripts/test-smtp.py --host smtp.gmail.com --port 587 --user email@gmail.com --pass "app-password" --to tujuan@gmail.com')
        sys.exit(1)

    try:
        print(f"\n[1/3] Menghubungi server SMTP di {host}:{port}...")
        server = smtplib.SMTP(host, port, timeout=15)
        server.set_debuglevel(0)
        
        print("[2/3] Mengaktifkan enkripsi STARTTLS...")
        server.ehlo()
        server.starttls()
        server.ehlo()

        if user and password:
            print(f"[3/3] Melakukan autentikasi untuk user '{user}'...")
            server.login(user, password)
        else:
            print("[3/3] Melewati login (tidak ada user/password yang ditentukan)...")

        # Create email message
        msg = MIMEMultipart()
        msg["From"] = from_email
        msg["To"] = args.to
        msg["Subject"] = "Tes Pengiriman Email SMTP — KeluargaMart"

        body = (
            "Halo,\n\n"
            "Ini adalah email uji coba untuk memverifikasi konfigurasi SMTP KeluargaMart.\n"
            "Jika Anda menerima email ini, berarti server SMTP telah berhasil terhubung dan siap digunakan "
            "untuk pengiriman OTP pendaftaran akun dan link reset password.\n\n"
            "Salam,\n"
            "Tim KeluargaMart"
        )
        msg.attach(MIMEText(body, "plain", "utf-8"))

        print(f"\n🚀 Mengirim email uji coba ke {args.to}...")
        server.sendmail(from_email, [args.to], msg.as_string())
        server.quit()

        print("\n✅ SUKSES! Email uji coba berhasil dikirim.")
        print(f"Silakan periksa kotak masuk (Inbox) atau folder Spam pada email: {args.to}")

    except smtplib.SMTPAuthenticationError as e:
        print(f"\n❌ GAGAL AUTENTIKASI (Username / Password salah): {e}")
        print("Tip untuk Gmail: Gunakan 'App Password' 16 digit, bukan password akun Gmail biasa.")
        sys.exit(1)
    except smtplib.SMTPConnectError as e:
        print(f"\n❌ GAGAL KONEKSI (Tidak dapat menghubungi {host}:{port}): {e}")
        sys.exit(1)
    except Exception as e:
        print(f"\n❌ ERROR: {e}")
        sys.exit(1)

if __name__ == "__main__":
    main()
