# ========================================================================
# Get User Details API Endpoint
#

from fastapi import APIRouter
from api.core.EasyMessage import API_BaseRequest
from api.core.EasyMessage import API_BaseResponse
from api.core.EasySQL import EasySQL
from api.core.EasyUser import EasyUser

from datetime import datetime
import json

print("BOOK USER API ENDPOINT")

router = APIRouter()
sql_connection = EasySQL()
user = EasyUser()

class API_Request(API_BaseRequest):
    target_user: str = ""
    booked_days: str = ""
    project_name: str = ""
    project_description: str = ""
    project_skills: str = ""
    project_location: str = ""

class API_Response(API_BaseResponse):
    pass

@router.post("/bookings/book_user", tags=['bookings'])
def book_user(request: API_Request):

    # Default Session Check
    api_response = API_Response()
    session_hash = request.session_hash
    booking_user = user.authenticate_session(session_hash)

    if(booking_user == False):
        api_response.success = False
        api_response.status_code = 403
        api_response.reason = "Login Failure"
        return api_response

    if(request.target_user == ""):
        api_response.success = False
        api_response.status_code = 404
        api_response.reason = "Username Missing"
        return api_response

    # First get the users existing bookings
    target_user_atr = user.get_attributes(request.target_user)
    current_bookings = target_user_atr.get('bookings') or {}

    # Second, perform cleanup here (for old dates)
    for booking in current_bookings:
        date_obj = datetime.strptime(booking, "%d/%m/%Y").date()

        if date_obj < datetime.today().date():
            del current_bookings[booking]

    # Third, check to see if the booked days are available
    booked_days = json.loads(request.booked_days)
    new_booked_days = current_bookings

    for booking_day in booked_days:
        if booking_day in current_bookings:
            api_response.success = False
            api_response.status_code = 200
            api_response.reason = "Already Booked"
            return api_response
        else:
            new_booked_days[booking_day] = {}
            new_booked_days[booking_day]['project_name'] = request.project_name
            new_booked_days[booking_day]['project_description'] = request.project_description
            new_booked_days[booking_day]['project_skills'] = request.project_skills
            new_booked_days[booking_day]['project_location'] = request.project_location
            new_booked_days[booking_day]['booking_user'] = booking_user

    # Now commit the bookings
    target_user_atr['bookings'] = new_booked_days

    if(user.set_attributes(request.target_user, target_user_atr) == False):
        api_response.success = False
        api_response.status_code = 500
        api_response.reason = "Internal Server Error"
        return api_response

    api_response.success = True
    api_response.status_code = 200
    api_response.reason = ""
    return api_response
