"""Car routes for managing rental vehicles."""
from flask import Blueprint, request, jsonify, g
from app import limiter
from app.utils import jwt_required, role_required, validate_request_body
from app.services import (
    create_car,
    get_car_by_id,
    get_cars,
    get_user_cars,
    update_car,
    delete_car,
    add_car_images,
    delete_car_image
)
from app.models import TransmissionType, FuelType

# Create cars blueprint
cars_bp = Blueprint('cars', __name__, url_prefix='/carstobechangedorremoved')


@cars_bp.route('', methods=['GET'])
@limiter.limit("100 per hour")
def list_cars():
    """
    Get list of cars with optional filters.
    
    Query params:
    - city, country, make, category
    - min_price, max_price
    - min_year, max_year
    - transmission, fuel_type, seats
    - page, per_page
    """
    # Get filters from query params
    filters = {
        'city': request.args.get('city'),
        'country': request.args.get('country'),
        'make': request.args.get('make'),
        'category': request.args.get('category'),
        'min_price': request.args.get('min_price', type=float),
        'max_price': request.args.get('max_price', type=float),
        'min_year': request.args.get('min_year', type=int),
        'max_year': request.args.get('max_year', type=int),
        'transmission': request.args.get('transmission'),
        'fuel_type': request.args.get('fuel_type'),
        'seats': request.args.get('seats', type=int)
    }
    
    # Convert transmission and fuel_type to enums if provided
    if filters.get('transmission'):
        try:
            filters['transmission'] = TransmissionType[filters['transmission'].upper()]
        except KeyError:
            pass
    
    if filters.get('fuel_type'):
        try:
            filters['fuel_type'] = FuelType[filters['fuel_type'].upper()]
        except KeyError:
            pass
    
    # Remove None values
    filters = {k: v for k, v in filters.items() if v is not None}
    
    # Pagination
    page = request.args.get('page', 1, type=int)
    per_page = request.args.get('per_page', 20, type=int)
    
    # Limit per_page to max 100
    per_page = min(per_page, 100)
    
    result = get_cars(filters=filters, page=page, per_page=per_page)
    
    return jsonify(result), 200


@cars_bp.route('/<car_id>', methods=['GET'])
@limiter.limit("100 per hour")
def get_car(car_id):
    """Get single car by ID."""
    # Check if user is authenticated (optional)
    user_id = None
    if hasattr(g, 'current_user'):
        user_id = str(g.current_user.id)
    
    result = get_car_by_id(car_id, user_id)
    
    status_code = 200 if result['success'] else 404
    return jsonify(result), status_code


@cars_bp.route('', methods=['POST'])
@limiter.limit("10 per hour")
@role_required(['owner', 'admin'])
def create_car_listing():
    """
    Create new car listing.
    
    Required fields: title, description, make, model, year, license_plate,
                     seats, transmission, fuel_type, price_per_day, city, country
    """
    data = request.get_json()
    
    # Validate required fields
    required_fields = [
        'title', 'description', 'make', 'model', 'year', 'license_plate',
        'seats', 'transmission', 'fuel_type', 'price_per_day', 'city', 'country'
    ]
    
    is_valid, error_response = validate_request_body(data, required_fields)
    if not is_valid:
        return error_response
    
    # Convert transmission and fuel_type strings to enums
    try:
        transmission = TransmissionType[data['transmission'].upper()]
        fuel_type = FuelType[data['fuel_type'].upper()]
    except (KeyError, AttributeError):
        return jsonify({
            'success': False,
            'message': 'Invalid transmission or fuel_type. Use: manual/automatic, petrol/diesel/electric/hybrid',
            'data': None
        }), 400
    
    # Get owner_id from authenticated user
    owner_id = g.current_user.id
    
    # Extract car data
    car_data = {
        'title': data['title'],
        'description': data['description'],
        'make': data['make'],
        'model': data['model'],
        'year': data['year'],
        'category': data.get('category'),
        'color': data.get('color'),
        'license_plate': data['license_plate'],
        'seats': data['seats'],
        'transmission': transmission,
        'fuel_type': fuel_type,
        'mileage': data.get('mileage'),
        'engine_capacity': data.get('engine_capacity'),
        'price_per_day': data['price_per_day'],
        'price_per_week': data.get('price_per_week'),
        'price_per_month': data.get('price_per_month'),
        'price_per_year': data.get('price_per_year'),
        'currency': data.get('currency', 'USD'),
        'security_deposit': data.get('security_deposit'),
        'city': data['city'],
        'country': data['country'],
        'pickup_location': data.get('pickup_location'),
        'latitude': data.get('latitude'),
        'longitude': data.get('longitude'),
        'features': data.get('features', []),
        'insurance_included': data.get('insurance_included', False),
        'fuel_policy': data.get('fuel_policy'),
        'minimum_age': data.get('minimum_age', 21),
        'driving_license_required': data.get('driving_license_required', True),
        'rental_terms': data.get('rental_terms')
    }
    
    # Extract images data if provided
    images_data = data.get('images')
    
    result = create_car(owner_id, car_data, images_data)
    
    status_code = 201 if result['success'] else 400
    return jsonify(result), status_code


@cars_bp.route('/my-listings', methods=['GET'])
@limiter.limit("50 per hour")
@jwt_required
def get_my_cars():
    """Get all cars owned by authenticated user."""
    owner_id = g.current_user.id
    
    result = get_user_cars(owner_id)
    
    return jsonify(result), 200


@cars_bp.route('/<car_id>', methods=['PUT'])
@limiter.limit("50 per hour")
@jwt_required
def update_car_listing(car_id):
    """Update car details. Only owner can update."""
    data = request.get_json()
    
    if not data:
        return jsonify({
            'success': False,
            'message': 'No data provided',
            'data': None
        }), 400
    
    # Convert transmission and fuel_type if provided
    if 'transmission' in data:
        try:
            data['transmission'] = TransmissionType[data['transmission'].upper()]
        except (KeyError, AttributeError):
            return jsonify({
                'success': False,
                'message': 'Invalid transmission type',
                'data': None
            }), 400
    
    if 'fuel_type' in data:
        try:
            data['fuel_type'] = FuelType[data['fuel_type'].upper()]
        except (KeyError, AttributeError):
            return jsonify({
                'success': False,
                'message': 'Invalid fuel type',
                'data': None
            }), 400
    
    owner_id = g.current_user.id
    
    result = update_car(car_id, owner_id, data)
    
    status_code = 200 if result['success'] else 400
    return jsonify(result), status_code


@cars_bp.route('/<car_id>', methods=['DELETE'])
@limiter.limit("20 per hour")
@jwt_required
def delete_car_listing(car_id):
    """Delete car. Only owner can delete."""
    owner_id = g.current_user.id
    
    result = delete_car(car_id, owner_id)
    
    status_code = 200 if result['success'] else 400
    return jsonify(result), status_code


@cars_bp.route('/<car_id>/images', methods=['POST'])
@limiter.limit("20 per hour")
@jwt_required
def add_images_to_car(car_id):
    """
    Add images to existing car.
    
    Expected JSON:
    {
      "images": [
        {"image_url": "...", "is_primary": true, "display_order": 0},
        {"image_url": "...", "display_order": 1}
      ]
    }
    """
    data = request.get_json()
    
    is_valid, error_response = validate_request_body(data, ['images'])
    if not is_valid:
        return error_response
    
    if not isinstance(data['images'], list):
        return jsonify({
            'success': False,
            'message': 'Images must be a list',
            'data': None
        }), 400
    
    owner_id = g.current_user.id
    
    result = add_car_images(car_id, owner_id, data['images'])
    
    status_code = 200 if result['success'] else 400
    return jsonify(result), status_code


@cars_bp.route('/<car_id>/images/<image_id>', methods=['DELETE'])
@limiter.limit("20 per hour")
@jwt_required
def delete_car_image_route(car_id, image_id):
    """Delete specific car image. Only owner can delete."""
    owner_id = g.current_user.id
    
    result = delete_car_image(image_id, owner_id)
    
    status_code = 200 if result['success'] else 400
    return jsonify(result), status_code