#!/usr/bin/env python3
"""Send the contents of a directory as a MIME message using SendGrid SMTP."""

import glob, os
import sys
import smtplib
import mimetypes
import mysql.connector

from email import encoders
from email.mime.audio import MIMEAudio
from email.mime.base import MIMEBase
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

COMMASPACE = ", "

def load_dotenv_simple(path):
    env = {}
    with open(path, "r", encoding="utf-8") as f:
        for raw in f:
            line = raw.strip()
            if not line or line.startswith("#"):
                continue
            if "=" not in line:
                continue
            key, val = line.split("=", 1)
            key = key.strip()
            val = val.strip()
            # remove optional surrounding quotes
            if (val.startswith('"') and val.endswith('"')) or (val.startswith("'") and val.endswith("'")):
                val = val[1:-1]
            env[key] = val
#            print("env=",key,val)
    return env

def strip_quotes(v):
    if not v:
        return v
    v = v.strip()
    if (v.startswith('"') and v.endswith('"')) or (v.startswith("'") and v.endswith("'")):
        return v[1:-1]
    return v

# Get email addresses
def getRecipients(defaults,jobname):
	cnx = mysql.connector.connect(user=defaults['dbuser'], password=defaults['dbpwd'],host=defaults['dbhost'],database=defaults['dbase'])
	
	print("jobname:"+jobname)
	mailTo = ""
	try:
		dataQuery = "SELECT distribution_list FROM report WHERE job_name='"+jobname+"' LIMIT 1"
		cursor = cnx.cursor(dictionary=True)
		cursor.execute(dataQuery)
		data = cursor.fetchall()
		r = 1
		for row in data:
#			print (row['distribution_list'])
			mailTo = (row['distribution_list'])
			r = r+1			
	except UnboundLocalError:
		raise 'MySql Error'
		
	finally:
		try:
			cursor.close()
			cnx.close()
		except:
			pass        
	return mailTo

def main():
    env = load_dotenv_simple('f:/webroot/kukupload/.env')
    db_host = env.get("DB_HOST") or env.get("db_host")
    db_name = env.get("DB_DATABASE") or env.get("db_database")
    db_user = env.get("DB_USERNAME") or env.get("db_username")
    db_pass = env.get("DB_PASSWORD") or env.get("db_password")
    db_port = env.get("DB_PORT")
    db_host = strip_quotes(db_host)
    db_name = strip_quotes(db_name)
    db_user = strip_quotes(db_user)
    db_pass = strip_quotes(db_pass)

    defaults = {}
    defaults['dbhost']=db_host
    defaults['dbuser']=db_user
    defaults['dbpwd']=db_pass
    defaults['dbase']=db_name

    smtp_sender = env.get("SENDGRID_SENDER") or env.get("sendgrid_sender")
    smtp_user = env.get("SENDGRID_USER") or env.get("sendgrid_user")
    smtp_key = env.get("SENDGRID_KEY") or env.get("sendgrid_key")
    smtp_sender = strip_quotes(smtp_sender)
    smtp_user = strip_quotes(smtp_user)
    smtp_key = strip_quotes(smtp_key)

    directory = sys.argv[1]
    if (len(sys.argv)>2):
        file = sys.argv[2]
    else:
        file = "*.*"
    
    recipients = []
    seen = set()
    
    if (len(sys.argv)>3):
        mailTo = getRecipients(defaults,sys.argv[3])
        if not mailTo:
            mailTo = sys.argv[3]
    else:
        mailTo = getRecipients(defaults,"reconcvims")
    for r in (x.strip() for x in mailTo.split(",")):
        if r and r not in seen:
            seen.add(r)
            recipients.append(r)

    if not directory:
        directory = '.'

    print("recipients",recipients)
    # Create the enclosing (outer) message
    outer = MIMEMultipart()
    outer["Subject"] = f"Contents of directory {directory}"
#    outer["To"] = COMMASPACE.join(recipients)
    outer["To"] = mailTo
    outer["From"] = smtp_sender
    outer.preamble = "You will not see this in a MIME-aware mail reader.\n"

    for filepath in glob.glob(directory+"/"+file):
        filename = os.path.basename(filepath)
        path = os.path.join(directory, filename)
        if not os.path.isfile(path):
            continue

        ctype, encoding = mimetypes.guess_type(path)
        if ctype is None or encoding is not None:
            ctype = "application/octet-stream"

        maintype, subtype = ctype.split("/", 1)

        if maintype == "text":
            with open(path, "r", encoding="utf-8", errors="replace") as fp:
                msg = MIMEText(fp.read(), _subtype=subtype)
        elif maintype == "image":
            with open(path, "rb") as fp:
                msg = MIMEImage(fp.read(), _subtype=subtype)
        elif maintype == "audio":
            with open(path, "rb") as fp:
                msg = MIMEAudio(fp.read(), _subtype=subtype)
        else:
            with open(path, "rb") as fp:
                msg = MIMEBase(maintype, subtype)
                msg.set_payload(fp.read())
            encoders.encode_base64(msg)

        # Set filename parameter for attachment
        msg.add_header("Content-Disposition", "attachment", filename=filename)
        outer.attach(msg)

    composed = outer.as_string()

    # Send using SendGrid SMTP
    SENDGRID_SMTP_SERVER = "smtp.sendgrid.net"
    SENDGRID_SMTP_PORT = 587

    envelope_from = smtp_sender
    if not envelope_from:
        # Best-effort: attempt to extract email from "Name <email@domain>"
        # If sender is just an email address, this still works fine.
        if "<" in smtp_sender and ">" in smtp_sender:
            envelope_from = smtp_sender.split("<", 1)[1].split(">", 1)[0].strip()
        else:
            envelope_from = smtp_sender.strip()

    try:
        with smtplib.SMTP(SENDGRID_SMTP_SERVER, SENDGRID_SMTP_PORT) as s:
            s.ehlo()
            s.starttls()
            s.ehlo()
            s.login(smtp_user, smtp_key)
            s.sendmail(envelope_from, recipients, composed)
    except Exception as e:
        raise RuntimeError(f"Failed to send via SendGrid SMTP: {e}") from e


if __name__ == "__main__":
    main()