from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
import json

db = SQLAlchemy()

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    google_id = db.Column(db.String(100), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    name = db.Column(db.String(100), nullable=False)
    picture = db.Column(db.Text)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    
    # Profile information
    full_name = db.Column(db.String(100))
    job_title = db.Column(db.String(100))
    phone_number = db.Column(db.String(20))
    profile_picture = db.Column(db.Text)
    
    # Company information
    company_name = db.Column(db.String(200))
    company_logo = db.Column(db.Text)
    license_number = db.Column(db.String(50))
    company_address = db.Column(db.Text)
    company_phone = db.Column(db.String(20))
    company_email = db.Column(db.String(120))
    
    # Owner information
    owner_name = db.Column(db.String(100))
    owner_email = db.Column(db.String(120))
    owner_phone = db.Column(db.String(20))

    def __repr__(self):
        return f'<User {self.name}>'

    def to_dict(self):
        return {
            'id': self.id,
            'google_id': self.google_id,
            'email': self.email,
            'name': self.name,
            'picture': self.picture,
            'full_name': self.full_name,
            'job_title': self.job_title,
            'phone_number': self.phone_number,
            'profile_picture': self.profile_picture,
            'company_name': self.company_name,
            'company_logo': self.company_logo,
            'license_number': self.license_number,
            'company_address': self.company_address,
            'company_phone': self.company_phone,
            'company_email': self.company_email,
            'owner_name': self.owner_name,
            'owner_email': self.owner_email,
            'owner_phone': self.owner_phone,
            'created_at': self.created_at.isoformat() if self.created_at else None
        }

class Inspection(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    property_address = db.Column(db.Text, nullable=False)
    inspection_date = db.Column(db.Date, nullable=False)
    inspector_name = db.Column(db.String(100))
    overall_condition = db.Column(db.String(50))
    key_observations = db.Column(db.Text)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
    
    # Inspection sections data stored as JSON
    exterior_data = db.Column(db.Text)  # JSON string
    interior_data = db.Column(db.Text)  # JSON string
    systems_data = db.Column(db.Text)   # JSON string
    
    user = db.relationship('User', backref=db.backref('inspections', lazy=True))

    def __repr__(self):
        return f'<Inspection {self.id} - {self.property_address}>'

    def to_dict(self):
        return {
            'id': self.id,
            'user_id': self.user_id,
            'property_address': self.property_address,
            'inspection_date': self.inspection_date.isoformat() if self.inspection_date else None,
            'inspector_name': self.inspector_name,
            'overall_condition': self.overall_condition,
            'key_observations': self.key_observations,
            'exterior_data': json.loads(self.exterior_data) if self.exterior_data else {},
            'interior_data': json.loads(self.interior_data) if self.interior_data else {},
            'systems_data': json.loads(self.systems_data) if self.systems_data else {},
            'created_at': self.created_at.isoformat() if self.created_at else None,
            'updated_at': self.updated_at.isoformat() if self.updated_at else None
        }

