import time
import logging

from email_validator import validate_email, EmailNotValidError

from src.database import SessionLocal
from src.enrichment.models import EnrichedLead
from src.outreach.email_generator import EmailBatchGenerator

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)


def run_email_generation():
    generator = EmailBatchGenerator()
    logger.info("Starting email generation job...")

    while True:
        try:
            with SessionLocal() as db:

                # Fetch leads ready for email generation
                approved_leads = db.query(EnrichedLead).filter(
                    EnrichedLead.email_generation_status == "approved",
                    EnrichedLead.is_email_generated == False,
                    EnrichedLead.email != None,
                    EnrichedLead.valid_email_exists == True
                ).all()

                if not approved_leads:
                    time.sleep(30)
                    continue

                logger.info(f"Found {len(approved_leads)} approved leads. Processing...")

                for lead in approved_leads:
                    try:

                        # -------------------------------
                        # Email Validation Step
                        # -------------------------------
                        try:
                            validated = validate_email(
                                lead.email,
                                check_deliverability=True
                            )

                            # Normalize email
                            lead.email = validated.email

                        except EmailNotValidError as e:
                            logger.warning(f"Invalid email for lead {lead.id}: {lead.email} ({str(e)})")

                            lead.valid_email_exists = False
                            db.commit()
                            continue

                        # -------------------------------
                        # Generate Emails
                        # -------------------------------
                        result = generator.generate_emails_for_lead(lead)

                        if result:
                            lead.is_email_generated = True
                            db.commit()

                            logger.info(
                                f"Generated emails for lead: {lead.title} ({lead.email})"
                            )

                        else:
                            logger.warning(
                                f"Failed to generate emails for lead: {lead.id}"
                            )

                    except Exception as e:
                        logger.error(
                            f"Error generating emails for lead {lead.id}: {e}"
                        )
                        db.rollback()

        except Exception as e:
            logger.error(f"Error in email generation loop: {e}")
            time.sleep(60)

        time.sleep(10)


if __name__ == "__main__":
    run_email_generation()