from flask import Blueprint, request, jsonify
from mongoengine.errors import ValidationError, DoesNotExist
from models.contact_us import ContactUsEnquiry
from models.exam import Exam
from models.sub_exam import SubExam
import re

contact_bp = Blueprint('contact_bp', __name__)  # register this in app.py


# simple email regex (not over-strict, just basic validation)
EMAIL_REGEX = re.compile(r"^[^@]+@[^@]+\.[^@]+$")


@contact_bp.route('/contact-us/enquiry', methods=['POST'])
def create_contact_us_enquiry():
    """
    POST /contact-us/enquiry

    Accepts JSON or form-data with:
    - email       (required, valid format)
    - mobile_no   (required, digits only)
    - exam_id     (required)
    - sub_exam_id (required)
    - found_us    (optional)
    - message     (required)
    """

    # ---- Read input (JSON or form) ----
    if request.is_json:
        data = request.get_json(silent=True) or {}
        email       = (data.get("email") or "").strip()
        mobile_no   = (data.get("mobile_no") or "").strip()
        exam_id     = (data.get("exam_id") or "").strip()
        sub_exam_id = (data.get("sub_exam_id") or "").strip()
        found_us    = data.get("found_us") or None
        message     = (data.get("message") or "").strip()
    else:
        email       = (request.form.get("email") or "").strip()
        mobile_no   = (request.form.get("mobile_no") or "").strip()
        exam_id     = (request.form.get("exam_id") or "").strip()
        sub_exam_id = (request.form.get("sub_exam_id") or "").strip()
        found_us    = request.form.get("found_us") or None
        message     = (request.form.get("message") or "").strip()

    # ---- Basic validations (return first error directly) ----
    if not email:
        return jsonify({"status": False, "message": "Email is required."}), 400

    # email format validation
    if not EMAIL_REGEX.match(email):
        return jsonify({"status": False, "message": "Invalid email format."}), 400

    if not mobile_no:
        return jsonify({"status": False, "message": "Mobile number is required."}), 400

    # mobile: digits only (no +, no spaces, no letters)
    if not mobile_no.isdigit():
        return jsonify({
            "status": False,
            "message": "Invalid mobile number. Only digits are allowed."
        }), 400

    # (optional) length rule – tweak as you like (e.g., 10 for India)
    if len(mobile_no) < 7 or len(mobile_no) > 15:
        return jsonify({
            "status": False,
            "message": "Invalid mobile number length."
        }), 400

    if not exam_id:
        return jsonify({"status": False, "message": "Exam is required."}), 400

    if not sub_exam_id:
        return jsonify({"status": False, "message": "Sub-exam is required."}), 400

    if not message:
        return jsonify({"status": False, "message": "Message is required."}), 400

    # ---- Validate exam & sub_exam references ----
    try:
        exam = Exam.objects(id=exam_id).only("id").first()
    except (ValidationError, DoesNotExist):
        exam = None

    if not exam:
        return jsonify({"status": False, "message": "Invalid exam selected."}), 400

    try:
        sub_exam = SubExam.objects(id=sub_exam_id).only("id").first()
    except (ValidationError, DoesNotExist):
        sub_exam = None

    if not sub_exam:
        return jsonify({"status": False, "message": "Invalid sub-exam selected."}), 400

    # ---- Create & save enquiry ----
    try:
        enquiry = ContactUsEnquiry(
            email=email,
            mobile_no=mobile_no,
            exam=exam,
            sub_exam=sub_exam,
            found_us=found_us,
            message=message
        )
        enquiry.save()
    except Exception:
        return jsonify({
            "status": False,
            "message": "Failed to save enquiry. Please try again later."
        }), 500

    # ---- Success response ----
    return jsonify({
        "status": True,
        "message": "Enquiry submitted successfully.",
        "data": {
            "id": str(enquiry.id),
            "email": enquiry.email,
            "mobile_no": enquiry.mobile_no,
            "exam_id": str(exam.id),
            "sub_exam_id": str(sub_exam.id),
            "found_us": enquiry.found_us,
            "message": enquiry.message,
            "created_date": enquiry.created_date.isoformat() if enquiry.created_date else None
        }
    }), 201
