"""PezaJob application requirements - candidate fields, documents, screening."""
from __future__ import annotations

import json
import re
import uuid
from typing import Any

CANDIDATE_FIELD_CHOICES = [
    ('full_name', 'Full Name'),
    ('phone', 'Phone Number'),
    ('email', 'Email Address'),
    ('profile', 'PezaJob Professional Profile'),
]

DOCUMENT_CHOICES = [
    ('cv', 'CV / Resume'),
    ('cover_letter', 'Cover Letter'),
    ('portfolio', 'Portfolio'),
    ('qualifications', 'Qualification Certificates'),
    ('other', 'Other Document'),
]

DEFAULT_CANDIDATE_FIELDS = [key for key, _label in CANDIDATE_FIELD_CHOICES]
DEFAULT_DOCUMENTS = ['cv']

CANDIDATE_FIELD_KEYS = {key for key, _label in CANDIDATE_FIELD_CHOICES}
DOCUMENT_KEYS = {key for key, _label in DOCUMENT_CHOICES}


def normalize_candidate_fields(values) -> list[str]:
    if not values:
        return list(DEFAULT_CANDIDATE_FIELDS)
    return [value for value in values if value in CANDIDATE_FIELD_KEYS]


def normalize_documents(values) -> list[str]:
    if not values:
        return list(DEFAULT_DOCUMENTS)
    cleaned = [value for value in values if value in DOCUMENT_KEYS]
    return cleaned or list(DEFAULT_DOCUMENTS)


def parse_screening_questions(raw) -> list[dict[str, Any]]:
    if not raw:
        return []
    if isinstance(raw, str):
        try:
            raw = json.loads(raw)
        except json.JSONDecodeError:
            return []
    if not isinstance(raw, list):
        return []
    questions = []
    for index, item in enumerate(raw):
        if not isinstance(item, dict):
            continue
        text = (item.get('text') or '').strip()
        if not text:
            continue
        question_id = (item.get('id') or '').strip() or f'q{index + 1}'
        questions.append({
            'id': question_id,
            'text': text,
            'required': bool(item.get('required')),
        })
    return questions


def screening_questions_to_json(questions) -> str:
    return json.dumps(parse_screening_questions(questions))


def extract_apply_email(text: str) -> str:
    if not text:
        return ''
    match = re.search(r'[\w.+-]+@[\w.-]+\.\w+', text)
    return match.group(0) if match else ''


def new_question_id() -> str:
    return f'q_{uuid.uuid4().hex[:8]}'
