import time
from datetime import datetime, timedelta
import mysql.connector
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager

# 1. KONFIGURASI DATABASE
db_config = {
    'host': 'localhost',
    'user': 'grandcom_rates',
    'password': '541xd31y2',
    'database': 'grandcom_rateshopper'
}

def get_hotel_list():
    conn = mysql.connector.connect(**db_config)
    cursor = conn.cursor(dictionary=True)
    # Ambil nama, id, dan URL khusus Tiket.com
    cursor.execute("SELECT id, hotel_name, tiket_url FROM hotels WHERE tiket_url IS NOT NULL")
    hotels = cursor.fetchall()
    cursor.close()
    conn.close()
    return hotels

def save_rate_to_db(hotel_id, rate_date, price):
    conn = mysql.connector.connect(**db_config)
    cursor = conn.cursor()
    query = """
    INSERT INTO room_rates (hotel_id, rate_date, price)
    VALUES (%s, %s, %s)
    ON DUPLICATE KEY UPDATE price = %s
    """
    cursor.execute(query, (hotel_id, rate_date, price, price))
    conn.commit()
    cursor.close()
    conn.close()

# 2. KONFIGURASI SELENIUM (BROWSER)
chrome_options = Options()
chrome_options.add_argument("--headless") 
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
# Penyamaran User-Agent agar tidak terdeteksi sebagai robot oleh sistem keamanan Tiket.com
chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36")

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)

# 3. PROSES SCRAPING DENGAN TARGET TIKET.COM
start_date = datetime.now() + timedelta(days=1) # Mulai memantau dari besok pagi
hotels = get_hotel_list()

print("=== MEMULAI OTOMATISASI RATE SHOPPER TIKET.COM ===")

try:
    # Kita looping berdasarkan HOTEL terlebih dahulu baru TANGGAL (lebih efisien untuk struktur Tiket.com)
    for hotel in hotels:
        hotel_id = hotel['id']
        hotel_name = hotel['hotel_name']
        base_url = hotel['tiket_url']
        
        print(f"\n🏨 Memproses Hotel: {hotel_name}")
        
        for day_offset in range(7):
            checkin_date = start_date + timedelta(days=day_offset)
            checkout_date = checkin_date + timedelta(days=1)
            
            checkin_str = checkin_date.strftime('%Y-%m-%d')
            checkout_str = checkout_date.strftime('%Y-%m-%d')
            
            # REKAYASA URL: Membuat URL dinamis sesuai format Tiket.com
            target_url = f"{base_url}?room=1&adult=2&night=1&checkin={checkin_str}&checkout={checkout_str}"
            
            driver.get(target_url)
            
            try:
                # STRATEGI SELEKTOR TIKET.COM:
                # Menggunakan WebDriverWait (lebih aman daripada time.sleep biasa). 
                # Script akan menunggu sampai elemen harga termurah muncul di halaman detail hotel Tiket.com.
                # Tiket.com sering menggunakan element teks berukuran besar atau dengan class 'price'/'room-price' untuk harga kamar.
                
                # Kita gunakan XPATH universal yang mencari teks angka berformat rupiah di area harga utama.
                # Catatan: Selektor data-testid atau kelas spesifik di bawah ini perlu dicocokkan kembali secara berkala 
                # menggunakan inspect element jika Tiket.com melakukan update major layout.
                price_element = WebDriverWait(driver, 10).until(
                    EC.presence_of_element_by_xpath("//div[contains(@class, 'price')]//p[contains(text(), 'Rp')] | //span[contains(@class, 'room-price')]")
                )
                
                price_text = price_element.text
                
                # Ekstraksi string menjadi angka murni (Rp 450.000 -> 450000)
                clean_price = int(''.join(filter(str.isdigit, price_text)))
                
                # Simpan ke database
                save_rate_to_db(hotel_id, checkin_str, clean_price)
                print(f"  -> Tgl {checkin_str}: Rp {clean_price:,}")
                
            except Exception as e:
                print(f"  -> Tgl {checkin_str}: ❌ Gagal mengambil harga (Mungkin Sold Out / Kamar Penuh)")
                
            # Berikan jeda antar request (2 detik) agar server Tiket.com tidak mencurigai aktivitas bot
            time.sleep(2)

finally:
    driver.quit()
    print("\n=== PROSES SELESAI. DASHBOARD ANDA SIAP DI-REFRESH ===")