import os
import uuid
from datetime import datetime
from flask import render_template, current_app, url_for
from app.extensions import db
from app.models.course import Certificate, CourseEnrollment, CertificateTemplate


def generate_certificate_number():
    """Generate unique certificate number."""
    date_part = datetime.utcnow().strftime("%Y%m%d")
    unique_part = uuid.uuid4().hex[:8].upper()
    return f"JC-{date_part}-{unique_part}"


def generate_certificate_pdf(enrollment):
    """Generate certificate PDF for completed course."""
    user = enrollment.user
    course = enrollment.course
    template = enrollment.certificate_template or course.certificate_template

    if not template:
        # Use default template
        template = CertificateTemplate.query.first()
        if not template:
            current_app.logger.error("No certificate template found")
            return None

    # Generate certificate number
    certificate_number = generate_certificate_number()

    # Create certificate record
    cert = Certificate(
        user_id=str(user.id),
        course_id=course.id,
        template_id=template.id,
        certificate_number=certificate_number,
        verification_url=url_for('courses.verify_certificate', cert_number=certificate_number, _external=True)
    )
    db.session.add(cert)
    db.session.flush()  # Get ID without committing

    # Update enrollment
    enrollment.certificate_id = cert.id
    enrollment.certificate_issued = True

    db.session.commit()

    # Generate PDF file path
    filename = f"{certificate_number}.pdf"
    pdf_path = os.path.join(
        current_app.root_path,
        'static',
        'uploads',
        'courses',
        'certificates',
        filename
    )
    os.makedirs(os.path.dirname(pdf_path), exist_ok=True)

    # For now, create a simple HTML-based certificate
    # In production, use WeasyPrint or ReportLab for proper PDF generation
    try:
        from weasyprint import HTML

        html_content = render_template('courses/certificate_pdf.html',
            user=user,
            course=course,
            template=template,
            certificate_number=certificate_number,
            date=datetime.utcnow().strftime('%Y-%m-%d')
        )

        HTML(string=html_content).write_pdf(pdf_path)

        return f"uploads/courses/certificates/{filename}"

    except ImportError:
        # Fallback: WeasyPrint not installed, return HTML path
        current_app.logger.warning("WeasyPrint not installed, certificate will be HTML only")
        return None


def get_certificate_template_path(template_id):
    """Get path to certificate template background."""
    template = CertificateTemplate.query.get(template_id)
    if template:
        return template.background_image
    return None


def verify_certificate(certificate_number):
    """Verify certificate by number."""
    cert = Certificate.query.filter_by(certificate_number=certificate_number).first()
    if cert:
        return {
            'valid': True,
            'user': cert.user.name if cert.user else 'Unknown',
            'course': cert.course.display_title if cert.course else 'Unknown',
            'issued_at': cert.issued_at.strftime('%Y-%m-%d'),
            'template': cert.template.name if cert.template else None
        }
    return {'valid': False}
