from flask import Flask, request, json
from duffel_api import ApiError, Duffel
from dotenv import load_dotenv
from os import environ
from datetime import date, timedelta

load_dotenv()

app = Flask(__name__)

# initialize Duffel client
duffel_client = Duffel(access_token=environ.get("DUFFEL_ACCESS_TOKEN"))


@app.errorhandler(ApiError)
def handle_exception(e):
    return json.dumps({
        "errors": e.errors,
        "meta": e.meta,
    }), e.meta['status']


@app.route("/api/search", methods=["POST"])
def search():
    tomorrow_date = date.today() + timedelta(days=1)
    offer_request = (
        duffel_client.offer_requests.create()
        .passengers([{"type": "adult"}])
        .slices([{
            "origin": request.json['origin'],
            "destination": request.json['destination'],
            "departure_date": tomorrow_date.strftime("%Y-%m-%d"),
        }])
        .execute()
    )

    offers = duffel_client.offers.list(
        offer_request.id, sort=request.json['sort'], max_connections=None, limit=1)

    return {
        "offer": next(iter(offers), None)
    }


@app.route("/api/book", methods=["POST"])
def book():
    order = (
        duffel_client.orders.create()
        .selected_offers([request.json['offerId']])
        .passengers(request.json['passengers'])
        .payments([{
            'amount': request.json['amount'],
            'currency': request.json['currency'],
            'type': 'balance',
        }])
        .execute()
    )

    return {
        'order': order,
    }
