from flask import Flask, request, render_template, jsonify
import googlemaps
import random
import logging

app = Flask(__name__)
gmaps = googlemaps.Client(key='AIzaSyAWq8PpbIhGpxnvxkF-YbD6kl03qmXI99o')

logging.basicConfig(level=logging.DEBUG)

def find_coordinates(query):
    try:
        geocode_result = gmaps.geocode(query, region='ca')
        if geocode_result:
            location = geocode_result[0]['geometry']['location']
            return location['lat'], location['lng']
        else:
            return None, None
    except googlemaps.exceptions.ApiError as e:
        logging.error(f'Error occurred during geocoding: {e}')
        return None, None

def get_distance(origin, destination):
    try:
        result = gmaps.distance_matrix(origins=[origin], destinations=[destination], mode="driving", departure_time="now")
        if result['status'] == 'OK':
            element = result['rows'][0]['elements'][0]
            if element['status'] == 'OK':
                distance_meters = element['distance']['value']
                distance_km = distance_meters / 1000.0  # Convert meters to kilometers
                return distance_km
        return None
    except googlemaps.exceptions.ApiError as e:
        logging.error(f'Error occurred during distance matrix request: {e}')
        return None

def find_random_restaurant(query, radius_km, cuisine, min_rating):
    lat, lng = find_coordinates(query)
    if lat is not None and lng is not None:
        try:
            radius_meters = radius_km * 1000  # Convert radius to meters for API call
            places = gmaps.places_nearby(location=(lat, lng), radius=radius_meters, type='restaurant', keyword=cuisine)
            if places['status'] == 'OK' and places['results']:
                filtered_places = []
                for place in places['results']:
                    rating = place.get("rating", 0)
                    if rating >= float(min_rating):
                        place_location = place["geometry"]["location"]
                        distance_km = get_distance((lat, lng), (place_location['lat'], place_location['lng']))
                        if distance_km is not None and distance_km <= radius_km:
                            filtered_places.append(place)
                if filtered_places:
                    random_place = random.choice(filtered_places)
                    name = random_place["name"]
                    address = random_place["vicinity"]
                    rating = random_place.get("rating", "No rating available")
                    place_location = random_place["geometry"]["location"]
                    return name, address, rating, place_location
                else:
                    return f'No {cuisine.capitalize()} restaurants found with rating {min_rating}+ within {radius_km} km', None, None, None
            else:
                return f'No {cuisine.capitalize()} restaurants found nearby', None, None, None
        except googlemaps.exceptions.ApiError as e:
            logging.error(f'Error occurred during places search: {e}')
            return f'Error occurred: {e}', None, None, None
    else:
        return 'Invalid location query', None, None, None

def convert_distance_to_km(distance_text):
    # Convert distance text to kilometers if it's in miles
    distance_value, unit = distance_text.split()
    distance_value = float(distance_value)
    if unit.lower().startswith('mile'):
        distance_value /= 1.609
        unit = 'km'
    return f'{distance_value:.2f} {unit}'

def get_distance_and_time(origin, destination):
    try:
        result = gmaps.distance_matrix(origins=[origin], destinations=[destination], mode="driving", departure_time="now")
        if result['status'] == 'OK':
            element = result['rows'][0]['elements'][0]
            if element['status'] == 'OK':
                distance = convert_distance_to_km(element['distance']['text'])
                duration = element['duration_in_traffic']['text']
                return distance, duration
        return None, None
    except googlemaps.exceptions.ApiError as e:
        logging.error(f'Error occurred during distance matrix request: {e}')
        return None, None

@app.route('/', methods=['GET'])
def index():
    return render_template('index.html')

@app.route('/random-restaurant', methods=['POST'])
def random_restaurant():
    data = request.json
    location = data.get('location')
    radius_km = float(data.get('radius'))
    cuisine = data.get('cuisine')
    rating = data.get('rating')
    restaurant_name, restaurant_address, restaurant_rating, restaurant_location = find_random_restaurant(location, radius_km, cuisine, rating)
    image_path = '/static/IMG_0694.jpg'  # Update with your actual image file path
    if restaurant_location:
        distance, duration = get_distance_and_time(location, (restaurant_location['lat'], restaurant_location['lng']))
    else:
        distance, duration = None, None
    return jsonify({
        'restaurant': restaurant_name,
        'address': restaurant_address,
        'rating': restaurant_rating,
        'image': image_path,
        'distance': distance,
        'duration': duration
    })

if __name__ == '__main__':
    app.run(debug=True)
