import time
import json
import certifi
import cloudscraper
import sys
import random

BOOKING_URL = "Api1"
ACCEPT_URL = "Api2"

LOGIN_HASH = "TOKEN1"
ACCEPT_LOGIN_HASH = "tOKEN2"

VEHICLE_ID = "36980"

proxies = [
    "http://proxy1.example.com:8080",
    "http://proxy2.example.com:8080",
    "http://proxy3.example.com:8080"
]

def create_scraper_with_proxy():
    proxy = random.choice(proxies)
    return cloudscraper.create_scraper(
        requesters=['requests'],
        proxies={'http': proxy, 'https': proxy}
    )

scraper = create_scraper_with_proxy()

headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer TOKEN",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"
}

previous_hashes = set()

MAX_RETRIES = 5
RETRY_DELAY = 2

success_count = 0

def send_booking_request():
    global success_count
    global scraper

    while True:
        time.sleep(0.5)

        for attempt in range(MAX_RETRIES):
            try:
                payload = {"login_hash": LOGIN_HASH}
                response = scraper.post(BOOKING_URL, headers=headers, json=payload, verify=certifi.where())

                if response.status_code == 200:
                    success_count += 1
                    sys.stdout.write(f"\r Başarılı istek sayısı: ({success_count})")
                    sys.stdout.flush()
                    check_new_bookings(response)
                    break 
                else:
                    print(f"\nHata: {response.status_code} - {response.text}")
                    scraper = create_scraper_with_proxy()
                    time.sleep(RETRY_DELAY * (2 ** attempt))
            except Exception as e:
                print(f"\n⚠Bağlantı hatası: {e}, tekrar deneniyor...")
                scraper = create_scraper_with_proxy()
                time.sleep(RETRY_DELAY * (2 ** attempt))
        else:
            print("\n Maksimum deneme sayısına ulaşıldı! Tekrar deneniyor...")
            continue

def check_new_bookings(response):
    try:
        current_data = response.json().get("data", {}).get("bookings", [])
    except json.JSONDecodeError as e:
        print(f"\nJSON dönüşüm hatası: {e}. Yanıt içeriği: {response.text}")
        return

    for booking in current_data:
        booking_hash = booking["booking_hash_link"]

        if booking_hash not in previous_hashes:
            print(f"\n<img draggable="false" class="emoji" alt="🚀" src="//cdn.r10.net/emojis/html/1f680.png"> **Yeni Rezervasyon Algılandı!** {booking_hash}")

            accept_payload = {
                "login_hash": ACCEPT_LOGIN_HASH,
                "booking_hash": booking_hash,
                "vehicle_id": VEHICLE_ID,
                "refuse": "accept"
            }

            for attempt in range(MAX_RETRIES):
                try:
                    accept_response = scraper.post(ACCEPT_URL, headers=headers, json=accept_payload, verify=certifi.where())

                    if accept_response.status_code == 200:
                        print(f"\nRezervasyon kabul edildi! {booking_hash}")
                        previous_hashes.add(booking_hash)
                        break
                    else:
                        print(f"\n Rezervasyon kabul hatası: {accept_response.status_code} - {accept_response.text}")
                        scraper = create_scraper_with_proxy()
                        time.sleep(RETRY_DELAY * (2 ** attempt))
                except Exception as e:
                    print(f"\n Bağlantı hatası (Rezervasyon kabulü): {e}, tekrar deneniyor...")
                    scraper = create_scraper_with_proxy()
                    time.sleep(RETRY_DELAY * (2 ** attempt))
            else:
                print(f"\n Maksimum deneme sayısına ulaşıldı! {booking_hash} rezervasyonu atlandı.")

send_booking_request()