from flask import Blueprint, request, jsonify, session, current_app
from google.oauth2 import id_token
from google.auth.transport import requests
import os
from src.models.user import db, User
from datetime import datetime

auth_bp = Blueprint('auth', __name__)

# You'll need to set this in your environment or config
GOOGLE_CLIENT_ID = os.environ.get('GOOGLE_CLIENT_ID', 'your-google-client-id')

@auth_bp.route('/google-login', methods=['POST'])
def google_login():
    try:
        data = request.get_json()
        token = data.get('token')
        
        if not token:
            return jsonify({'error': 'No token provided'}), 400
        
        # For demo purposes, we'll simulate Google OAuth verification
        # In production, you would verify the token with Google
        if token == 'demo_token':
            # Demo user data
            user_info = {
                'sub': 'demo_google_id_123',
                'email': 'demo@example.com',
                'name': 'Demo User',
                'picture': 'https://via.placeholder.com/150'
            }
        else:
            # In production, uncomment this to verify with Google:
            # idinfo = id_token.verify_oauth2_token(token, requests.Request(), GOOGLE_CLIENT_ID)
            # user_info = idinfo
            return jsonify({'error': 'Invalid token'}), 400
        
        # Check if user exists
        user = User.query.filter_by(google_id=user_info['sub']).first()
        
        if not user:
            # Create new user
            user = User(
                google_id=user_info['sub'],
                email=user_info['email'],
                name=user_info['name'],
                picture=user_info.get('picture'),
                full_name=user_info['name'],
                job_title='Property Manager',
                created_at=datetime.utcnow()
            )
            db.session.add(user)
            db.session.commit()
        
        # Store user ID in session
        session['user_id'] = user.id
        
        return jsonify({
            'success': True,
            'user': user.to_dict()
        })
        
    except Exception as e:
        current_app.logger.error(f"Login error: {str(e)}")
        return jsonify({'error': str(e)}), 500

@auth_bp.route('/logout', methods=['POST'])
def logout():
    session.pop('user_id', None)
    return jsonify({'success': True})

@auth_bp.route('/me', methods=['GET'])
def get_current_user():
    user_id = session.get('user_id')
    if not user_id:
        return jsonify({'error': 'Not authenticated'}), 401
    
    user = User.query.get(user_id)
    if not user:
        return jsonify({'error': 'User not found'}), 404
    
    return jsonify({'user': user.to_dict()})

@auth_bp.route('/profile', methods=['PUT'])
def update_profile():
    user_id = session.get('user_id')
    if not user_id:
        return jsonify({'error': 'Not authenticated'}), 401
    
    user = User.query.get(user_id)
    if not user:
        return jsonify({'error': 'User not found'}), 404
    
    data = request.get_json()
    
    # Update user profile fields
    if 'full_name' in data:
        user.full_name = data['full_name']
    if 'job_title' in data:
        user.job_title = data['job_title']
    if 'phone_number' in data:
        user.phone_number = data['phone_number']
    if 'profile_picture' in data:
        user.profile_picture = data['profile_picture']
    if 'company_name' in data:
        user.company_name = data['company_name']
    if 'company_logo' in data:
        user.company_logo = data['company_logo']
    if 'license_number' in data:
        user.license_number = data['license_number']
    if 'company_address' in data:
        user.company_address = data['company_address']
    if 'company_phone' in data:
        user.company_phone = data['company_phone']
    if 'company_email' in data:
        user.company_email = data['company_email']
    if 'owner_name' in data:
        user.owner_name = data['owner_name']
    if 'owner_email' in data:
        user.owner_email = data['owner_email']
    if 'owner_phone' in data:
        user.owner_phone = data['owner_phone']
    
    try:
        db.session.commit()
        return jsonify({
            'success': True,
            'user': user.to_dict()
        })
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(f"Profile update error: {str(e)}")
        return jsonify({'error': str(e)}), 500

