
from datetime import datetime
from ..extensions import db
from .base import BaseModel


class Job(BaseModel):
    """Job model for Australian construction marketplace"""
    __tablename__ = 'jobs'
    
    # Core Job Information
    title = db.Column(db.String(200), nullable=False)
    description = db.Column(db.Text, nullable=False)
    contractor_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
    category_id = db.Column(db.Integer, db.ForeignKey('categories.id'), nullable=False)
    location = db.Column(db.String(100), nullable=False)
    budget_min = db.Column(db.Numeric(10, 2))
    budget_max = db.Column(db.Numeric(10, 2))
    hourly_rate = db.Column(db.Numeric(10, 2))
    
    # Legal/Safety Requirements
    whs_requirements = db.Column(db.Text)
    insurance_required = db.Column(db.Boolean, default=True)
    white_card_required = db.Column(db.Boolean, default=True)
    
    # Scheduling Fields
    start_datetime = db.Column(db.DateTime, nullable=True)
    duration = db.Column(db.String(50))
    
    # Workforce Requirements  
    workers_needed = db.Column(db.Integer, default=1)
    
    # Equipment/Logistics
    own_tools_required = db.Column(db.Boolean, default=False)
    own_transport_required = db.Column(db.Boolean, default=False)
    
    # Payment Terms
    payment_terms = db.Column(db.String(50), default='on_completion')
    
    # System Fields
    status = db.Column(db.String(20), default='open')
    date_posted = db.Column(db.DateTime, default=datetime.utcnow)
    deadline = db.Column(db.DateTime)
    applications_count = db.Column(db.Integer, default=0)
    accepted_workers_count = db.Column(db.Integer, default=0)
    
    # Relationships
    contractor = db.relationship('User', foreign_keys=[contractor_id], backref='posted_jobs')
    category = db.relationship('Category', 
                             backref='jobs',
                             primaryjoin='Job.category_id==Category.id',
                             foreign_keys=[category_id])
    
    def has_space_for_workers(self):
        """Check if job can accept more workers"""
        return self.accepted_workers_count < self.workers_needed
    
    def increment_accepted_workers(self):
        """Increment the count of accepted workers and update status if full"""
        self.accepted_workers_count += 1
        if self.accepted_workers_count >= self.workers_needed:
            self.status = 'assigned'
            return True
        return False
    
    def __repr__(self):
        return f'<Job {self.title} - {self.location}>'


class Application(BaseModel):
    """Application model for job applications"""
    __tablename__ = 'applications'
    
    job_id = db.Column(db.Integer, db.ForeignKey('jobs.id'), nullable=False)
    worker_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
    status = db.Column(db.String(20), default='pending')
    proposed_rate = db.Column(db.Numeric(10, 2))
    cover_letter = db.Column(db.Text)
    date_applied = db.Column(db.DateTime, default=datetime.utcnow)
    abn_verified = db.Column(db.Boolean, default=False)
    insurance_verified = db.Column(db.Boolean, default=False)
    
    # Relationships
    job = db.relationship('Job', backref='applications')
    worker = db.relationship('User', foreign_keys=[worker_id], backref='job_applications')
    
    def __repr__(self):
        return f'<Application {self.worker_id} -> Job {self.job_id}>'
