"""House routes for managing rental properties."""
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_house,
    get_house_by_id,
    get_houses,
    get_user_houses,
    update_house,
    delete_house,
    add_house_images,
    delete_house_image
)

# Create houses blueprint
houses_bp = Blueprint('houses', __name__, url_prefix='/houses')


@houses_bp.route('', methods=['GET'])
@limiter.limit("100 per hour")
def list_houses():
    """
    Get list of houses with optional filters.
    
    Query params:
    - city, country, category
    - min_price, max_price
    - bedrooms, max_guests
    - page, per_page
    """
    # Get filters from query params
    filters = {
        'city': request.args.get('city'),
        'country': request.args.get('country'),
        'category': request.args.get('category'),
        'min_price': request.args.get('min_price', type=float),
        'max_price': request.args.get('max_price', type=float),
        'bedrooms': request.args.get('bedrooms', type=int),
        'max_guests': request.args.get('max_guests', type=int)
    }
    
    # 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_houses(filters=filters, page=page, per_page=per_page)
    
    return jsonify(result), 200


@houses_bp.route('/<house_id>', methods=['GET'])
@limiter.limit("100 per hour")
def get_house(house_id):
    """Get single house 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_house_by_id(house_id, user_id)
    
    status_code = 200 if result['success'] else 404
    return jsonify(result), status_code


@houses_bp.route('', methods=['POST'])
@limiter.limit("10 per hour")
@role_required(['owner', 'admin'])
def create_house_listing():
    """
    Create new house listing.
    
    Required fields: title, description, price_per_day, city, country,
                     address, bedrooms, bathrooms, max_guests
    """
    data = request.get_json()
    
    # Validate required fields
    required_fields = [
        'title', 'description', 'price_per_day', 'city', 
        'country', 'address', 'bedrooms', 'bathrooms', 'max_guests'
    ]
    
    is_valid, error_response = validate_request_body(data, required_fields)
    if not is_valid:
        return error_response
    
    # Get owner_id from authenticated user
    owner_id = g.current_user.id
    
    # Extract house data
    house_data = {
        'title': data['title'],
        'description': data['description'],
        'category': data.get('category'),
        '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'),
        'address': data['address'],
        'city': data['city'],
        'country': data['country'],
        'latitude': data.get('latitude'),
        'longitude': data.get('longitude'),
        'bedrooms': data['bedrooms'],
        'bathrooms': data['bathrooms'],
        'max_guests': data['max_guests'],
        'square_feet': data.get('square_feet'),
        'floor_number': data.get('floor_number'),
        'features': data.get('features', []),
        'house_rules': data.get('house_rules')
    }
    
    # Extract images data if provided
    images_data = data.get('images')
    
    result = create_house(owner_id, house_data, images_data)
    
    status_code = 201 if result['success'] else 400
    return jsonify(result), status_code


@houses_bp.route('/my-listings', methods=['GET'])
@limiter.limit("50 per hour")
@jwt_required
def get_my_houses():
    """Get all houses owned by authenticated user."""
    owner_id = g.current_user.id
    
    result = get_user_houses(owner_id)
    
    return jsonify(result), 200


@houses_bp.route('/<house_id>', methods=['PUT'])
@limiter.limit("50 per hour")
@jwt_required
def update_house_listing(house_id):
    """Update house details. Only owner can update."""
    data = request.get_json()
    
    if not data:
        return jsonify({
            'success': False,
            'message': 'No data provided',
            'data': None
        }), 400
    
    owner_id = g.current_user.id
    
    result = update_house(house_id, owner_id, data)
    
    status_code = 200 if result['success'] else 400
    return jsonify(result), status_code


@houses_bp.route('/<house_id>', methods=['DELETE'])
@limiter.limit("20 per hour")
@jwt_required
def delete_house_listing(house_id):
    """Delete house. Only owner can delete."""
    owner_id = g.current_user.id
    
    result = delete_house(house_id, owner_id)
    
    status_code = 200 if result['success'] else 400
    return jsonify(result), status_code


@houses_bp.route('/<house_id>/images', methods=['POST'])
@limiter.limit("20 per hour")
@jwt_required
def add_images_to_house(house_id):
    """
    Add images to existing house.
    
    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_house_images(house_id, owner_id, data['images'])
    
    status_code = 200 if result['success'] else 400
    return jsonify(result), status_code


@houses_bp.route('/<house_id>/images/<image_id>', methods=['DELETE'])
@limiter.limit("20 per hour")
@jwt_required
def delete_house_image_route(house_id, image_id):
    """Delete specific house image. Only owner can delete."""
    owner_id = g.current_user.id
    
    result = delete_house_image(image_id, owner_id)
    
    status_code = 200 if result['success'] else 400
    return jsonify(result), status_code