import re
from flask import Blueprint, request, jsonify, current_app
from models.subscription import Subscription

subscription_bp = Blueprint("subscription_bp", __name__)

# -----------------------------------
# Simple email format validator
# -----------------------------------
EMAIL_REGEX = re.compile(r"^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$")

def is_valid_email(email: str) -> bool:
    if not email:
        return False
    return EMAIL_REGEX.match(email) is not None


@subscription_bp.route("/subscribe", methods=["POST"])
def subscribe_email():
    """
    POST /api/subscribe
    Body: { "email": "user@example.com" }  (JSON)
    or    email=user@example.com           (form/url-encoded)
    """
    try:
        # Support both JSON and form submissions
        data = request.get_json(silent=True) or {}
        raw_email = data.get("email") or request.form.get("email") or ""
        email = raw_email.strip().lower()

        # 1) Required check
        if not email:
            return jsonify(success=False, message="Email is required"), 400

        # 2) Format validation
        if not is_valid_email(email):
            return jsonify(success=False, message="Please enter a valid email address"), 400

        # 3) Duplicate check (case-insensitive)
        existing = Subscription.objects(email__iexact=email).first()

        if existing:
            if existing.status == 1:
                # Already active
                return jsonify(
                    success=True,
                    message="You are already subscribed.",
                ), 200

        # 4) Create new subscription
        sub = Subscription(email=email, status=1)
        sub.save()

        return jsonify(
            success=True,
            message="Subscribed successfully",
            data={
                "id": str(sub.id),
                "email": sub.email,
                "status": sub.status,
                "created_date": sub.created_date.isoformat()
                if sub.created_date else None,
            },
        ), 201

    except Exception as e:
        current_app.logger.exception("Error in /api/subscribe: %s", e)
        return jsonify(success=False, message="Something went wrong"), 500
