
/*=======================
HOTEL_BOOKING REQUEST API
=======================*/
$router->post('hotel_booking', function () {

    include "./config.php";

    $param = array(
        'price_original'      => $_POST["price_original"] ?? 0,
        'price_markup'        => $_POST["price_markup"] ?? 0,
        'vat'                  => $_POST["vat"] ?? '',
        'tax'                  => $_POST["tax"] ?? '',
        'gst'                  => $_POST["gst"] ?? '',
        'first_name'           => $_POST["first_name"] ?? '',
        'last_name'            => $_POST["last_name"] ?? '',
        'email'                => $_POST["email"] ?? '',
        'address'              => $_POST["address"] ?? '',
        'phone_country_code'   => $_POST["phone_country_code"] ?? '',
        'phone'                => $_POST["phone"] ?? '',
        'country'              => $_POST["country"] ?? '',
        'nationality'          => $_POST["nationality"] ?? '',
        'stars'                => $_POST["stars"] ?? 0,
        'hotel_id'             => $_POST["hotel_id"] ?? '',
        'hotel_name'           => $_POST["hotel_name"] ?? '',
        'hotel_phone'          => $_POST["hotel_phone"] ?? '',
        'hotel_email'          => $_POST["hotel_email"] ?? '',
        'hotel_website'        => $_POST["hotel_website"] ?? '',
        'hotel_address'        => $_POST["hotel_address"] ?? '',
        'room_data'            => $_POST["room_data"] ?? '[]',
        'location'             => $_POST["location"] ?? '',
        'location_cords'       => $_POST["location_cords"] ?? '',
        'hotel_img'            => $_POST["hotel_img"] ?? '',
        'checkin'              => $_POST["checkin"] ?? '',
        'checkout'             => $_POST["checkout"] ?? '',
		'booking_nights' => $_POST["booking_nights"] ?? 1,
        'adults'               => $_POST["adults"] ?? 0,
        'childs'               => $_POST["childs"] ?? 0,
        'child_ages'           => $_POST["child_ages"] ?? '',
        'currency_original'    => $_POST["currency_original"] ?? '',
        'currency_markup'      => $_POST["currency_markup"] ?? '',
        'booking_data'         => $_POST["booking_data"] ?? '[]',
        'supplier'             => $_POST["supplier"] ?? '',
        'user_id'              => $_POST["user_id"] ?? 0,
        'user_data'            => $_POST["user_data"] ?? '{}',
        'guest'                => $_POST["guest"] ?? '[]',
        'booking_ref_no'       => date('YmdHis'),
        'booking_date'         => date('Y-m-d'),
        'payment_gateway'      => $_POST["payment_gateway"] ?? '',
        'payment_status'       => 'unpaid',
        'booking_status'       => 'pending',
    );

    try {
        $insert_id = $db->insert("hotels_bookings", $param);
    } catch (\Throwable $e) {
        @file_put_contents(__DIR__.'/../../cache/tunisiabeds/booking_errors.log',
            date('Y-m-d H:i:s')." [INSERT FAILED] ".$e->getMessage()."\nPARAM: ".json_encode($param)."\n\n",
            FILE_APPEND
        );
        echo json_encode(['status' => false, 'message' => 'Booking insert failed', 'error' => $e->getMessage()]);
        die;
    }

    if (!$insert_id) {
        echo json_encode(['status' => false, 'message' => 'Booking insert failed (no id returned)']);
        die;
    }

    $data = (json_decode($_POST["user_data"] ?? '{}'));
    $data = (object) array_merge((array) $data, array('booking_ref_no' => $param['booking_ref_no']));

    try {
        $hook = "hotels_booking";
        include "./hooks.php";
    } catch (\Throwable $e) {
        @file_put_contents(__DIR__.'/../../cache/tunisiabeds/booking_errors.log',
            date('Y-m-d H:i:s')." [hooks.php FAILED] ".$e->getMessage()."\n\n", FILE_APPEND);
    }

    echo json_encode(array('status' => true, 'id' => $db->id(), 'booking_ref_no' => $param['booking_ref_no']));
});

/*=======================
HOTEL_BOOKING INVOICE API
=======================*/
$router->post('hotels/invoice', function () {

    // CONFIG FILE
    include "./config.php";

    // VALIDATION
    required('booking_ref_no');
    $booking_ref_no = $_POST["booking_ref_no"];

    $response = $db->select("hotels_bookings", "*", ['booking_ref_no' => $booking_ref_no]); // SELECT THE BOOKING DATA FROM DATABASE ACCORDING TO BOOKING REFERENCE NUMBER 
    if (!empty($response)) {
        echo json_encode(array('status' => true, 'response' => $response)); // RETURN INVOICE IF BOOKING REFERENCE NUMBER IS CORRECT
    } else {
        echo json_encode(array('status' => false, 'response' => 'The booking reference number in invalid')); // RETURN IF BOOKING REFERENCE NUMBER IS CORRECT
    }
});

/*=======================
HOTEL_BOOKING PAYMENT UPDATE API
=======================*/
$router->post('hotels/booking_update', function () {
    include "./config.php";

    $booking_ref_no = $_POST['booking_ref_no'];
    $data_hotel = $db->select("hotels_bookings", "*", ['booking_ref_no' => $booking_ref_no]); // SELECT THE BOOKING DATA FROM DATABASE ACCORDING TO BOOKING REFERENCE NUMBER
    if (!empty($data_hotel)) {
        $supplier_name = $data_hotel[0]['supplier'];

     if (strtolower($supplier_name) == 'tunisiabeds') {
    require_once __DIR__ . '/TunisiaBedsService.php';
    $tbService = new TunisiaBedsService($db);

    // booking_data = tableau de chambres, chacune avec son propre room_result_id + adults/children
    $roomsBookingData = json_decode($data_hotel[0]['booking_data'], true);

    $roomsPayload = [];
    if (!empty($roomsBookingData) && is_array($roomsBookingData)) {
        foreach ($roomsBookingData as $roomEntry) {

            $paxAdults = [];
            foreach (($roomEntry['adults'] ?? []) as $i => $a) {
                $paxAdults[] = [
                    "Civility" => $a['civility'] ?? 'Mr',
                    "Name"     => $a['first_name'] ?? 'Guest',
                    "Surname"  => $a['last_name'] ?? 'Guest',
                    "Holder"   => !empty($a['holder'])
                ];
            }

            $paxChildren = [];
            foreach (($roomEntry['children'] ?? []) as $c) {
                $paxChildren[] = [
                    "Name"    => $c['first_name'] ?? 'Child',
                    "Surname" => $c['last_name'] ?? 'Child',
                    "Age"     => (int)($c['age'] ?? 7)
                ];
            }

            $roomsPayload[] = [
                "Id"         => (int)$roomEntry['room_result_id'],
                "Boarding"   => (int)$roomEntry['boarding_id'],
                "View"       => $roomEntry['views'] ?? [],
                "Supplement" => $roomEntry['supplements'] ?? [],
                "Pax"        => [
                    "Adult" => $paxAdults,
                    "Child" => $paxChildren
                ]
            ];
        }
    }

    $city_id  = $tbService->getCityIdByName(explode(',', $data_hotel[0]['location'] ?? "")[0]);
    $hotel_id = $data_hotel[0]['hotel_id'];
    $checkin  = $data_hotel[0]['checkin'];
    $checkout = $data_hotel[0]['checkout'];

    // PreBooking - recommandé par la doc pour vérifier prix/dispo avant confirmation
    $preCheck = $tbService->createBooking($hotel_id, $city_id, $checkin, $checkout, $roomsPayload, true);

    if (!$preCheck || empty($preCheck['State']) || $preCheck['State'] === 'Cancelled') {
        echo json_encode([
            'status'   => false,
            'response' => 'Disponibilité ou tarif modifié entre-temps, merci de relancer la recherche.',
            'error'    => json_encode($preCheck)
        ]);
        die;
    }

    // Confirmation finale
    $bookingResponse = $tbService->createBooking($hotel_id, $city_id, $checkin, $checkout, $roomsPayload, false);

    if ($bookingResponse && isset($bookingResponse['Id'])) {
        $prn = $bookingResponse['Id'];

                    $db->update("hotels_bookings", [
                        "booking_pnr"      => $prn,
                        "booking_response" => json_encode($bookingResponse),
                        "payment_status"   => $_POST['payment_status'] ?? 'paid',
                        "booking_status"   => $_POST['booking_status'] ?? 'confirmed',
                        "transaction_id"   => $_POST['transaction_id'] ?? '',
                        "payment_gateway"  => $_POST['payment_gateway'] ?? '',
                    ], ["booking_ref_no" => $booking_ref_no]);

                    $db->insert("transactions", [
                        "description"     => $_POST['transaction_desc'] ?? 'Hotel Booking',
                        "user_id"         => $_POST['transaction_user_id'] ?? ($user_data['id'] ?? 0),
                        "trx_id"          => $_POST['transaction_id'] ?? '',
                        "type"            => $_POST['transaction_type'] ?? 'Hotel',
                        "date"            => date('Y-m-d'),
                        "amount"          => $_POST['transaction_amount'] ?? $data_hotel[0]['price_markup'],
                        "payment_gateway" => $_POST['transaction_payment_gateway'] ?? '',
                        "currency"        => $_POST['transaction_currency'] ?? $data_hotel[0]['currency_markup'],
                    ]);

                    $user = json_decode($data_hotel[0]['user_data']);
                    $hook = "hotels_update_booking";
                    include "./hooks.php";

                    echo json_encode(['status' => true, 'Prn' => $prn]);
                    die;
                } else {
                    echo json_encode(['status' => false, 'response' => 'Supplier Booking Failed', 'error' => json_encode($bookingResponse)]);
                    die;
                }
            }

        $gethotels = gethotelmoduledata($supplier_name);

       

        if ($gethotels[0]['dev_mode'] == 1) {
            $evn_hotel = 'pro';
        } else {
            $evn_hotel = 'dev';
        }


        $param = array(
            'c1' => $gethotels[0]['c1'],
            'c2' => $gethotels[0]['c2'],
            'c3' => $gethotels[0]['c3'],
            'c4' => $gethotels[0]['c4'],
            'c5' => $gethotels[0]['c5'],
            'evn' => $evn_hotel,
            //'endpoint' => "http://localhost/modules/hotels/".strtolower($gethotels[0]['name'])."/api/v1/booking",
            //'endpoint' => "https://api.phptravels.com/flights/".strtolower($data[0]['supplier'])."/api/v1/booking",
            "booking_ref_no" => $data_hotel[0]['booking_ref_no'],
            "booking_data" => $data_hotel[0]['booking_data'],
            "guest" => $data_hotel[0]['guest'],
            "nationality" => $data_hotel[0]['nationality'],
            "user_data" => $data_hotel[0]['user_data'],

        );

            $url = "https://api.phptravels.com/hotels/".strtolower($gethotels[0]['name'])."/api/v1/booking";
            $ch = curl_init($url);
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($param)); // Encode the data in the proper format
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            $resp_hotel = curl_exec($ch);
            if (curl_errno($ch)) {
            echo 'cURL error: ' . curl_error($ch);
            }
            curl_close($ch);

        //$resp_hotel = sendhotelRequest('POST', 'search', $param);
        $booking_hotel = json_decode($resp_hotel);

        $db->update("hotels_bookings", [
            "booking_pnr" => $booking_hotel->Prn,
            "booking_response" => $resp_hotel,
            "payment_status" => $_POST['payment_status'],
            "booking_status" => $_POST['booking_status'],
            "transaction_id" => $_POST['transaction_id'],
            "payment_gateway" => $_POST['payment_gateway'],
            "error_response" => $booking_hotel->response_error,
        ], [
            "booking_ref_no" => $_POST['booking_ref_no']
        ]);

        $db->insert("transactions", [
            "description" => $_POST['transaction_desc'],
            "user_id" =>  $_POST['transaction_user_id'],
            "trx_id" => $_POST['transaction_id'],
            "type" => $_POST['transaction_type'],
            "date" => date('Y-m-d'),
            "amount" => $_POST['transaction_amount'],
            "payment_gateway" =>  $_POST['transaction_payment_gateway'],
            "currency" => $_POST['transaction_currency'] ,
        ]);

        $user = (json_decode($data_hotel[0]['user_data']));
            $hook = "hotels_update_booking";
            include "./hooks.php";

        if ($booking_hotel->Prn) {
            echo json_encode(array('status' => true, 'Prn' => $booking_hotel->Prn));
        } else {
            echo json_encode(array('status' => false, 'Prn' => $booking_hotel->Prn));
        }
    }else{
        echo json_encode(array('status' => false, 'response' => 'Please valid booking ref no'));
    }
});

/*=======================
HOTEL_BOOKING PAYMENT UPDATE API
=======================*/
$router->post('hotels/cancellation', function () {
    //CONFIG FILE
    include "./config.php";

    // VALIDATION
    required('booking_ref_no');
    $booking_ref_no = $_POST["booking_ref_no"];

    $params = array('cancellation_request' => 1, );
    $data = $db->update("hotels_bookings", $params, ["booking_ref_no" => $booking_ref_no]); //UPDATE THE CANCELATION STATUS IN DATABASE IF REQUEST IS MADE

    $booking = $db->select("hotels_bookings", '*', ["booking_ref_no" => $booking_ref_no]);
    $user = (json_decode($booking[0]['user_data']));

    // HOOK 
    $hook = "hotels/cancellation_request";
    include "./hooks.php";

    echo json_encode(array('status' => true, 'message' => 'request received successfully'));

});

/*=======================
TUNISIABEDS: City search for Select2 autocomplete
=======================*/
$router->get('hotels_locations_tb', function () {
    include "./config.php";
    $q = isset($_GET['q']) ? trim($_GET['q']) : '';
    if (strlen($q) < 2) { echo json_encode(['data' => []]); die; }
    $cities = $db->select('tb_cities', ['id', 'name'], ['name[~]' => $q]);
    $data = [];
    foreach ($cities as $c) {
        $slug = strtolower(str_replace(' ', '-', $c['name']));
        $data[] = [
            'id'           => $slug,
            'text'         => $c['name'],
            'tb_id'        => (int)$c['id'],
            'country_name' => 'TunisiaBeds'
        ];
    }
    echo json_encode(['data' => $data]);
    die;
});

/*=======================
TUNISIABEDS: Store selected city ID in session
=======================*/
$router->post('hotels/store_tb_city', function () {
    if (isset($_POST['tb_city_id'])) {
        $_SESSION['tb_city_id'] = (int)$_POST['tb_city_id'];
    }
    echo json_encode(['status' => true]);
    die;
});

/*=======================
TUNISIABEDS: Static data sync via TunisiaBedsService
=======================*/
$router->get('tunisiabeds_sync', function () {
    include "./config.php";
    
	require_once __DIR__ . '/TunisiaBedsService.php';
    $module = $db->select('modules', '*', ['name' => 'tunisiabeds']);
    if (empty($module)) {
        echo "<p> TunisiaBeds module not found in database.</p>";
        die;
    }
    $tbService = new TunisiaBedsService($db);
    $result    = $tbService->syncStaticData();
	

echo "<pre>";
print_r($result);
echo "</pre>";

die;
   
});
?> <br />
<b>Warning</b>:  Cannot modify header information - headers already sent by (output started at /var/www/vhosts/piko.tn/httpdocs/PHPTRAVELS/api/routes/Hotels.php:952) in <b>/var/www/vhosts/piko.tn/httpdocs/PHPTRAVELS/api/routes/Tours.php</b> on line <b>3</b><br />
<br />
<b>Warning</b>:  Cannot modify header information - headers already sent by (output started at /var/www/vhosts/piko.tn/httpdocs/PHPTRAVELS/api/routes/Hotels.php:952) in <b>/var/www/vhosts/piko.tn/httpdocs/PHPTRAVELS/api/routes/Tours.php</b> on line <b>4</b><br />
<br />
<b>Warning</b>:  Cannot modify header information - headers already sent by (output started at /var/www/vhosts/piko.tn/httpdocs/PHPTRAVELS/api/routes/Hotels.php:952) in <b>/var/www/vhosts/piko.tn/httpdocs/PHPTRAVELS/api/routes/Tours.php</b> on line <b>5</b><br />
<br />
<b>Warning</b>:  Cannot modify header information - headers already sent by (output started at /var/www/vhosts/piko.tn/httpdocs/PHPTRAVELS/api/routes/Hotels.php:952) in <b>/var/www/vhosts/piko.tn/httpdocs/PHPTRAVELS/api/routes/Omra.php</b> on line <b>3</b><br />
<br />
<b>Warning</b>:  Cannot modify header information - headers already sent by (output started at /var/www/vhosts/piko.tn/httpdocs/PHPTRAVELS/api/routes/Hotels.php:952) in <b>/var/www/vhosts/piko.tn/httpdocs/PHPTRAVELS/api/routes/Omra.php</b> on line <b>4</b><br />
<br />
<b>Warning</b>:  Cannot modify header information - headers already sent by (output started at /var/www/vhosts/piko.tn/httpdocs/PHPTRAVELS/api/routes/Hotels.php:952) in <b>/var/www/vhosts/piko.tn/httpdocs/PHPTRAVELS/api/routes/Omra.php</b> on line <b>5</b><br />
<br />
<b>Warning</b>:  Cannot modify header information - headers already sent by (output started at /var/www/vhosts/piko.tn/httpdocs/PHPTRAVELS/api/routes/Hotels.php:952) in <b>/var/www/vhosts/piko.tn/httpdocs/PHPTRAVELS/api/routes/Cars.php</b> on line <b>3</b><br />
<br />
<b>Warning</b>:  Cannot modify header information - headers already sent by (output started at /var/www/vhosts/piko.tn/httpdocs/PHPTRAVELS/api/routes/Hotels.php:952) in <b>/var/www/vhosts/piko.tn/httpdocs/PHPTRAVELS/api/routes/Cars.php</b> on line <b>4</b><br />
<br />
<b>Warning</b>:  Cannot modify header information - headers already sent by (output started at /var/www/vhosts/piko.tn/httpdocs/PHPTRAVELS/api/routes/Hotels.php:952) in <b>/var/www/vhosts/piko.tn/httpdocs/PHPTRAVELS/api/routes/Cars.php</b> on line <b>5</b><br />
{"status":"false","message":"404 page not found"}