from flask import Blueprint, request, jsonify, session
from datetime import datetime
import json
from src.models.user import db, User, Inspection

inspections_bp = Blueprint('inspections', __name__)

@inspections_bp.route('/inspections', methods=['GET'])
def get_inspections():
    user_id = session.get('user_id')
    if not user_id:
        return jsonify({'error': 'Not authenticated'}), 401
    
    inspections = Inspection.query.filter_by(user_id=user_id).order_by(Inspection.created_at.desc()).all()
    return jsonify({
        'inspections': [inspection.to_dict() for inspection in inspections]
    })

@inspections_bp.route('/inspections', methods=['POST'])
def create_inspection():
    user_id = session.get('user_id')
    if not user_id:
        return jsonify({'error': 'Not authenticated'}), 401
    
    data = request.get_json()
    
    inspection = Inspection(
        user_id=user_id,
        property_address=data.get('property_address', ''),
        inspection_date=datetime.strptime(data.get('inspection_date'), '%Y-%m-%d').date() if data.get('inspection_date') else datetime.now().date(),
        inspector_name=data.get('inspector_name', ''),
        overall_condition=data.get('overall_condition', ''),
        key_observations=data.get('key_observations', ''),
        exterior_data=json.dumps(data.get('exterior_data', {})),
        interior_data=json.dumps(data.get('interior_data', {})),
        systems_data=json.dumps(data.get('systems_data', {}))
    )
    
    db.session.add(inspection)
    db.session.commit()
    
    return jsonify({
        'success': True,
        'inspection': inspection.to_dict()
    })

@inspections_bp.route('/inspections/<int:inspection_id>', methods=['GET'])
def get_inspection(inspection_id):
    user_id = session.get('user_id')
    if not user_id:
        return jsonify({'error': 'Not authenticated'}), 401
    
    inspection = Inspection.query.filter_by(id=inspection_id, user_id=user_id).first()
    if not inspection:
        return jsonify({'error': 'Inspection not found'}), 404
    
    return jsonify({'inspection': inspection.to_dict()})

@inspections_bp.route('/inspections/<int:inspection_id>', methods=['PUT'])
def update_inspection(inspection_id):
    user_id = session.get('user_id')
    if not user_id:
        return jsonify({'error': 'Not authenticated'}), 401
    
    inspection = Inspection.query.filter_by(id=inspection_id, user_id=user_id).first()
    if not inspection:
        return jsonify({'error': 'Inspection not found'}), 404
    
    data = request.get_json()
    
    # Update inspection fields
    if 'property_address' in data:
        inspection.property_address = data['property_address']
    if 'inspection_date' in data:
        inspection.inspection_date = datetime.strptime(data['inspection_date'], '%Y-%m-%d').date()
    if 'inspector_name' in data:
        inspection.inspector_name = data['inspector_name']
    if 'overall_condition' in data:
        inspection.overall_condition = data['overall_condition']
    if 'key_observations' in data:
        inspection.key_observations = data['key_observations']
    if 'exterior_data' in data:
        inspection.exterior_data = json.dumps(data['exterior_data'])
    if 'interior_data' in data:
        inspection.interior_data = json.dumps(data['interior_data'])
    if 'systems_data' in data:
        inspection.systems_data = json.dumps(data['systems_data'])
    
    inspection.updated_at = datetime.utcnow()
    db.session.commit()
    
    return jsonify({
        'success': True,
        'inspection': inspection.to_dict()
    })

@inspections_bp.route('/inspections/<int:inspection_id>', methods=['DELETE'])
def delete_inspection(inspection_id):
    user_id = session.get('user_id')
    if not user_id:
        return jsonify({'error': 'Not authenticated'}), 401
    
    inspection = Inspection.query.filter_by(id=inspection_id, user_id=user_id).first()
    if not inspection:
        return jsonify({'error': 'Inspection not found'}), 404
    
    db.session.delete(inspection)
    db.session.commit()
    
    return jsonify({'success': True})

