from datetime import datetime, timezone
from extensions import db

# Canonical option lists (used by the form, seed data, and analytics buckets).
GENDERS = ['Male', 'Female', 'Prefer not to say']
EDUCATION_LEVELS = ['Secondary / High school', 'Diploma / Certificate', 'Undergraduate', 'Graduate+', 'Self-taught']
EMPLOYMENT_STATUSES = ['Student', 'Employed', 'Unemployed', 'Freelancer', 'Self-employed']
LANGUAGES = ['Python', 'JavaScript', 'Java', 'C / C++', 'PHP', 'HTML/CSS', 'Dart', 'Other']
LEARNING_DURATIONS = ['Not started', 'Less than 6 months', '6–12 months', '1–2 years', '2+ years']
TRACKS = ['Frontend', 'Backend', 'Full-Stack', 'Not sure yet']
CHALLENGES = ['No Mentorship', "Can't Build Projects", 'Need Internship', "Can't Earn", 'Need Community']
REASONS = ['Learn to code', 'Get a job', 'Build real projects', 'Start freelancing', 'Change career', 'Join a community']
HEARD_FROM = ['WhatsApp', 'Facebook', 'Instagram', 'LinkedIn', 'Friend / referral', 'University', 'Event / community', 'Other']

# Fields required for an application to count as "complete".
REQUIRED_FIELDS = ['full_name', 'email', 'phone', 'gender', 'country', 'city',
                   'education', 'employment_status', 'motivation']


class Application(db.Model):
    """A Predev cohort application.

    Fields are grouped to match the Tier 1 analytics roadmap. Multi-select fields
    (programming_languages, challenges) are stored as comma-separated strings and
    split in analytics.py.
    """
    __tablename__ = 'applications'

    id = db.Column(db.Integer, primary_key=True)

    # --- Personal / demographic ---
    full_name = db.Column(db.String(120), nullable=False)
    email = db.Column(db.String(120), nullable=False)
    phone = db.Column(db.String(40), nullable=False)
    gender = db.Column(db.String(30))
    age = db.Column(db.Integer)
    country = db.Column(db.String(80))
    city = db.Column(db.String(120))
    education = db.Column(db.String(60))
    employment_status = db.Column(db.String(60))

    # --- Technology background ---
    has_programming_experience = db.Column(db.Boolean, default=False)
    programming_languages = db.Column(db.String(255))   # comma-separated
    learning_duration = db.Column(db.String(40))

    # --- Experience ---
    has_projects = db.Column(db.Boolean, default=False)
    internship_experience = db.Column(db.Boolean, default=False)
    team_project_experience = db.Column(db.Boolean, default=False)

    # --- Challenges (comma-separated multi-select) ---
    challenges = db.Column(db.String(255))

    # --- Goals ---
    reason_for_joining = db.Column(db.String(80))
    weekly_hours = db.Column(db.Integer)
    commitment_score = db.Column(db.Integer)            # 1–10
    motivation = db.Column(db.Text)

    # --- Track & marketing ---
    track = db.Column(db.String(60))
    heard_from = db.Column(db.String(60))
    portfolio = db.Column(db.String(255))

    # --- Meta ---
    status = db.Column(db.String(20), default='complete')   # complete | incomplete
    created_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc))

    # ---- helpers ----
    def languages_list(self):
        return [s.strip() for s in (self.programming_languages or '').split(',') if s.strip()]

    def challenges_list(self):
        return [s.strip() for s in (self.challenges or '').split(',') if s.strip()]

    @property
    def is_complete(self):
        return all(getattr(self, f) not in (None, '') for f in REQUIRED_FIELDS)

    def __repr__(self):
        return f'<Application {self.full_name} - {self.email}>'
