import re

from django import forms


PHONE_FORMAT_ERROR = (
    "Enter a landline with 5-7 digits or a mobile number with 10-13 digits. "
    "You can use +, spaces, hyphens, parentheses, or dots."
)
PHONE_NUMBER_PATTERNS = {
    "landline": r"^(?=(?:[^0-9]*[0-9]){5,7}[^0-9]*$)\+?[0-9\s().-]+$",
    "mobile": r"^(?=(?:[^0-9]*[0-9]){10,13}[^0-9]*$)\+?[0-9\s().-]+$",
}


def classify_phone_number(value):
    if value is None or isinstance(value, bool):
        return None

    number = str(value).strip()
    if not number:
        return None
    if not re.fullmatch(r"\+?[0-9\s().-]+", number):
        return None

    digit_count = sum(character in "0123456789" for character in number)
    if 5 <= digit_count <= 7:
        return "landline"
    if 10 <= digit_count <= 13:
        return "mobile"
    return None


class PhoneNumberField(forms.CharField):
    default_error_messages = {"invalid": PHONE_FORMAT_ERROR}

    def validate(self, value):
        super().validate(value)
        if value and classify_phone_number(value) is None:
            raise forms.ValidationError(self.error_messages["invalid"], code="invalid")
