'use client';

import { useState, useEffect, useRef } from 'react';
import Image from 'next/image';
import { useAuthStore } from '@/store/authStore';
import axios from 'axios';
import LivePreview from './LivePreview';
import waylowLogo from '@/public/waylow-logo.png';

const API_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3000';
const WS_URL = process.env.NEXT_PUBLIC_WS_URL || 'ws://localhost:3000';

interface PriceEndpoint {
  label: string;
  apiUrl: string;
  devOnly?: boolean;
}

const PRICE_ENDPOINTS: PriceEndpoint[] = [
  { label: 'Local', apiUrl: 'http://localhost:3000', devOnly: true },
  { label: 'waylow.world', apiUrl: 'https://waylow.world' },
  { label: 'US', apiUrl: 'https://us.waylow.world' },
  // To add a new location, just add a line here
];

const isDev = API_URL.includes('localhost');
const activeEndpoints = PRICE_ENDPOINTS.filter(ep => !ep.devOnly || isDev);

interface PriceResult {
  label: string;
  apiUrl: string;
  sessionId: string | null;
  sessionToken: string | null;
  data: {
    provider?: string;
    desktop: { price: string; currency: string; description: string };
    mobile: { price: string; currency: string; description: string };
    reserveUrl: string;
    traffic?: { totalBytes: number; requestCount: number };
  } | null;
  loading: boolean;
  error: string | null;
}

type DeviceMode = 'desktop' | 'mobile';

interface Country {
  code: string;
  name: string;
  flag: string;
}

const COUNTRIES: Country[] = [
  { code: 'AFG', name: 'Afghanistan', flag: '🇦🇫' },
  { code: 'ALB', name: 'Albania', flag: '🇦🇱' },
  { code: 'DZA', name: 'Algeria', flag: '🇩🇿' },
  { code: 'AND', name: 'Andorra', flag: '🇦🇩' },
  { code: 'AGO', name: 'Angola', flag: '🇦🇴' },
  { code: 'ATG', name: 'Antigua and Barbuda', flag: '🇦🇬' },
  { code: 'ARG', name: 'Argentina', flag: '🇦🇷' },
  { code: 'ARM', name: 'Armenia', flag: '🇦🇲' },
  { code: 'AUS', name: 'Australia', flag: '🇦🇺' },
  { code: 'AUT', name: 'Austria', flag: '🇦🇹' },
  { code: 'AZE', name: 'Azerbaijan', flag: '🇦🇿' },
  { code: 'BHS', name: 'Bahamas', flag: '🇧🇸' },
  { code: 'BHR', name: 'Bahrain', flag: '🇧🇭' },
  { code: 'BGD', name: 'Bangladesh', flag: '🇧🇩' },
  { code: 'BRB', name: 'Barbados', flag: '🇧🇧' },
  { code: 'BLR', name: 'Belarus', flag: '🇧🇾' },
  { code: 'BEL', name: 'Belgium', flag: '🇧🇪' },
  { code: 'BLZ', name: 'Belize', flag: '🇧🇿' },
  { code: 'BEN', name: 'Benin', flag: '🇧🇯' },
  { code: 'BTN', name: 'Bhutan', flag: '🇧🇹' },
  { code: 'BOL', name: 'Bolivia', flag: '🇧🇴' },
  { code: 'BIH', name: 'Bosnia and Herzegovina', flag: '🇧🇦' },
  { code: 'BWA', name: 'Botswana', flag: '🇧🇼' },
  { code: 'BRA', name: 'Brazil', flag: '🇧🇷' },
  { code: 'BRN', name: 'Brunei', flag: '🇧🇳' },
  { code: 'BGR', name: 'Bulgaria', flag: '🇧🇬' },
  { code: 'BFA', name: 'Burkina Faso', flag: '🇧🇫' },
  { code: 'BDI', name: 'Burundi', flag: '🇧🇮' },
  { code: 'CPV', name: 'Cabo Verde', flag: '🇨🇻' },
  { code: 'KHM', name: 'Cambodia', flag: '🇰🇭' },
  { code: 'CMR', name: 'Cameroon', flag: '🇨🇲' },
  { code: 'CAN', name: 'Canada', flag: '🇨🇦' },
  { code: 'CAF', name: 'Central African Republic', flag: '🇨🇫' },
  { code: 'TCD', name: 'Chad', flag: '🇹🇩' },
  { code: 'CHL', name: 'Chile', flag: '🇨🇱' },
  { code: 'CHN', name: 'China', flag: '🇨🇳' },
  { code: 'COL', name: 'Colombia', flag: '🇨🇴' },
  { code: 'COM', name: 'Comoros', flag: '🇰🇲' },
  { code: 'COG', name: 'Congo', flag: '🇨🇬' },
  { code: 'COD', name: 'Congo (DRC)', flag: '🇨🇩' },
  { code: 'CRI', name: 'Costa Rica', flag: '🇨🇷' },
  { code: 'CIV', name: "Côte d'Ivoire", flag: '🇨🇮' },
  { code: 'HRV', name: 'Croatia', flag: '🇭🇷' },
  { code: 'CUB', name: 'Cuba', flag: '🇨🇺' },
  { code: 'CYP', name: 'Cyprus', flag: '🇨🇾' },
  { code: 'CZE', name: 'Czechia', flag: '🇨🇿' },
  { code: 'DNK', name: 'Denmark', flag: '🇩🇰' },
  { code: 'DJI', name: 'Djibouti', flag: '🇩🇯' },
  { code: 'DMA', name: 'Dominica', flag: '🇩🇲' },
  { code: 'DOM', name: 'Dominican Republic', flag: '🇩🇴' },
  { code: 'ECU', name: 'Ecuador', flag: '🇪🇨' },
  { code: 'EGY', name: 'Egypt', flag: '🇪🇬' },
  { code: 'SLV', name: 'El Salvador', flag: '🇸🇻' },
  { code: 'GNQ', name: 'Equatorial Guinea', flag: '🇬🇶' },
  { code: 'ERI', name: 'Eritrea', flag: '🇪🇷' },
  { code: 'EST', name: 'Estonia', flag: '🇪🇪' },
  { code: 'SWZ', name: 'Eswatini', flag: '🇸🇿' },
  { code: 'ETH', name: 'Ethiopia', flag: '🇪🇹' },
  { code: 'FJI', name: 'Fiji', flag: '🇫🇯' },
  { code: 'FIN', name: 'Finland', flag: '🇫🇮' },
  { code: 'FRA', name: 'France', flag: '🇫🇷' },
  { code: 'GAB', name: 'Gabon', flag: '🇬🇦' },
  { code: 'GMB', name: 'Gambia', flag: '🇬🇲' },
  { code: 'GEO', name: 'Georgia', flag: '🇬🇪' },
  { code: 'DEU', name: 'Germany', flag: '🇩🇪' },
  { code: 'GHA', name: 'Ghana', flag: '🇬🇭' },
  { code: 'GRC', name: 'Greece', flag: '🇬🇷' },
  { code: 'GRD', name: 'Grenada', flag: '🇬🇩' },
  { code: 'GTM', name: 'Guatemala', flag: '🇬🇹' },
  { code: 'GIN', name: 'Guinea', flag: '🇬🇳' },
  { code: 'GNB', name: 'Guinea-Bissau', flag: '🇬🇼' },
  { code: 'GUY', name: 'Guyana', flag: '🇬🇾' },
  { code: 'HTI', name: 'Haiti', flag: '🇭🇹' },
  { code: 'HND', name: 'Honduras', flag: '🇭🇳' },
  { code: 'HUN', name: 'Hungary', flag: '🇭🇺' },
  { code: 'ISL', name: 'Iceland', flag: '🇮🇸' },
  { code: 'IND', name: 'India', flag: '🇮🇳' },
  { code: 'IDN', name: 'Indonesia', flag: '🇮🇩' },
  { code: 'IRN', name: 'Iran', flag: '🇮🇷' },
  { code: 'IRQ', name: 'Iraq', flag: '🇮🇶' },
  { code: 'IRL', name: 'Ireland', flag: '🇮🇪' },
  { code: 'ISR', name: 'Israel', flag: '🇮🇱' },
  { code: 'ITA', name: 'Italy', flag: '🇮🇹' },
  { code: 'JAM', name: 'Jamaica', flag: '🇯🇲' },
  { code: 'JPN', name: 'Japan', flag: '🇯🇵' },
  { code: 'JOR', name: 'Jordan', flag: '🇯🇴' },
  { code: 'KAZ', name: 'Kazakhstan', flag: '🇰🇿' },
  { code: 'KEN', name: 'Kenya', flag: '🇰🇪' },
  { code: 'KIR', name: 'Kiribati', flag: '🇰🇮' },
  { code: 'PRK', name: 'North Korea', flag: '🇰🇵' },
  { code: 'KOR', name: 'South Korea', flag: '🇰🇷' },
  { code: 'KWT', name: 'Kuwait', flag: '🇰🇼' },
  { code: 'KGZ', name: 'Kyrgyzstan', flag: '🇰🇬' },
  { code: 'LAO', name: 'Laos', flag: '🇱🇦' },
  { code: 'LVA', name: 'Latvia', flag: '🇱🇻' },
  { code: 'LBN', name: 'Lebanon', flag: '🇱🇧' },
  { code: 'LSO', name: 'Lesotho', flag: '🇱🇸' },
  { code: 'LBR', name: 'Liberia', flag: '🇱🇷' },
  { code: 'LBY', name: 'Libya', flag: '🇱🇾' },
  { code: 'LIE', name: 'Liechtenstein', flag: '🇱🇮' },
  { code: 'LTU', name: 'Lithuania', flag: '🇱🇹' },
  { code: 'LUX', name: 'Luxembourg', flag: '🇱🇺' },
  { code: 'MDG', name: 'Madagascar', flag: '🇲🇬' },
  { code: 'MWI', name: 'Malawi', flag: '🇲🇼' },
  { code: 'MYS', name: 'Malaysia', flag: '🇲🇾' },
  { code: 'MDV', name: 'Maldives', flag: '🇲🇻' },
  { code: 'MLI', name: 'Mali', flag: '🇲🇱' },
  { code: 'MLT', name: 'Malta', flag: '🇲🇹' },
  { code: 'MHL', name: 'Marshall Islands', flag: '🇲🇭' },
  { code: 'MRT', name: 'Mauritania', flag: '🇲🇷' },
  { code: 'MUS', name: 'Mauritius', flag: '🇲🇺' },
  { code: 'MEX', name: 'Mexico', flag: '🇲🇽' },
  { code: 'FSM', name: 'Micronesia', flag: '🇫🇲' },
  { code: 'MDA', name: 'Moldova', flag: '🇲🇩' },
  { code: 'MCO', name: 'Monaco', flag: '🇲🇨' },
  { code: 'MNG', name: 'Mongolia', flag: '🇲🇳' },
  { code: 'MNE', name: 'Montenegro', flag: '🇲🇪' },
  { code: 'MAR', name: 'Morocco', flag: '🇲🇦' },
  { code: 'MOZ', name: 'Mozambique', flag: '🇲🇿' },
  { code: 'MMR', name: 'Myanmar', flag: '🇲🇲' },
  { code: 'NAM', name: 'Namibia', flag: '🇳🇦' },
  { code: 'NRU', name: 'Nauru', flag: '🇳🇷' },
  { code: 'NPL', name: 'Nepal', flag: '🇳🇵' },
  { code: 'NLD', name: 'Netherlands', flag: '🇳🇱' },
  { code: 'NZL', name: 'New Zealand', flag: '🇳🇿' },
  { code: 'NIC', name: 'Nicaragua', flag: '🇳🇮' },
  { code: 'NER', name: 'Niger', flag: '🇳🇪' },
  { code: 'NGA', name: 'Nigeria', flag: '🇳🇬' },
  { code: 'MKD', name: 'North Macedonia', flag: '🇲🇰' },
  { code: 'NOR', name: 'Norway', flag: '🇳🇴' },
  { code: 'OMN', name: 'Oman', flag: '🇴🇲' },
  { code: 'PAK', name: 'Pakistan', flag: '🇵🇰' },
  { code: 'PLW', name: 'Palau', flag: '🇵🇼' },
  { code: 'PAN', name: 'Panama', flag: '🇵🇦' },
  { code: 'PNG', name: 'Papua New Guinea', flag: '🇵🇬' },
  { code: 'PRY', name: 'Paraguay', flag: '🇵🇾' },
  { code: 'PER', name: 'Peru', flag: '🇵🇪' },
  { code: 'PHL', name: 'Philippines', flag: '🇵🇭' },
  { code: 'POL', name: 'Poland', flag: '🇵🇱' },
  { code: 'PRT', name: 'Portugal', flag: '🇵🇹' },
  { code: 'QAT', name: 'Qatar', flag: '🇶🇦' },
  { code: 'ROU', name: 'Romania', flag: '🇷🇴' },
  { code: 'RUS', name: 'Russia', flag: '🇷🇺' },
  { code: 'RWA', name: 'Rwanda', flag: '🇷🇼' },
  { code: 'KNA', name: 'Saint Kitts and Nevis', flag: '🇰🇳' },
  { code: 'LCA', name: 'Saint Lucia', flag: '🇱🇨' },
  { code: 'VCT', name: 'Saint Vincent and the Grenadines', flag: '🇻🇨' },
  { code: 'WSM', name: 'Samoa', flag: '🇼🇸' },
  { code: 'SMR', name: 'San Marino', flag: '🇸🇲' },
  { code: 'STP', name: 'São Tomé and Príncipe', flag: '🇸🇹' },
  { code: 'SAU', name: 'Saudi Arabia', flag: '🇸🇦' },
  { code: 'SEN', name: 'Senegal', flag: '🇸🇳' },
  { code: 'SRB', name: 'Serbia', flag: '🇷🇸' },
  { code: 'SYC', name: 'Seychelles', flag: '🇸🇨' },
  { code: 'SLE', name: 'Sierra Leone', flag: '🇸🇱' },
  { code: 'SGP', name: 'Singapore', flag: '🇸🇬' },
  { code: 'SVK', name: 'Slovakia', flag: '🇸🇰' },
  { code: 'SVN', name: 'Slovenia', flag: '🇸🇮' },
  { code: 'SLB', name: 'Solomon Islands', flag: '🇸🇧' },
  { code: 'SOM', name: 'Somalia', flag: '🇸🇴' },
  { code: 'ZAF', name: 'South Africa', flag: '🇿🇦' },
  { code: 'SSD', name: 'South Sudan', flag: '🇸🇸' },
  { code: 'ESP', name: 'Spain', flag: '🇪🇸' },
  { code: 'LKA', name: 'Sri Lanka', flag: '🇱🇰' },
  { code: 'SDN', name: 'Sudan', flag: '🇸🇩' },
  { code: 'SUR', name: 'Suriname', flag: '🇸🇷' },
  { code: 'SWE', name: 'Sweden', flag: '🇸🇪' },
  { code: 'CHE', name: 'Switzerland', flag: '🇨🇭' },
  { code: 'SYR', name: 'Syria', flag: '🇸🇾' },
  { code: 'TWN', name: 'Taiwan', flag: '🇹🇼' },
  { code: 'TJK', name: 'Tajikistan', flag: '🇹🇯' },
  { code: 'TZA', name: 'Tanzania', flag: '🇹🇿' },
  { code: 'THA', name: 'Thailand', flag: '🇹🇭' },
  { code: 'TLS', name: 'Timor-Leste', flag: '🇹🇱' },
  { code: 'TGO', name: 'Togo', flag: '🇹🇬' },
  { code: 'TON', name: 'Tonga', flag: '🇹🇴' },
  { code: 'TTO', name: 'Trinidad and Tobago', flag: '🇹🇹' },
  { code: 'TUN', name: 'Tunisia', flag: '🇹🇳' },
  { code: 'TUR', name: 'Turkey', flag: '🇹🇷' },
  { code: 'TKM', name: 'Turkmenistan', flag: '🇹🇲' },
  { code: 'TUV', name: 'Tuvalu', flag: '🇹🇻' },
  { code: 'UGA', name: 'Uganda', flag: '🇺🇬' },
  { code: 'UKR', name: 'Ukraine', flag: '🇺🇦' },
  { code: 'ARE', name: 'United Arab Emirates', flag: '🇦🇪' },
  { code: 'GBR', name: 'United Kingdom', flag: '🇬🇧' },
  { code: 'USA', name: 'United States', flag: '🇺🇸' },
  { code: 'URY', name: 'Uruguay', flag: '🇺🇾' },
  { code: 'UZB', name: 'Uzbekistan', flag: '🇺🇿' },
  { code: 'VUT', name: 'Vanuatu', flag: '🇻🇺' },
  { code: 'VAT', name: 'Vatican City', flag: '🇻🇦' },
  { code: 'VEN', name: 'Venezuela', flag: '🇻🇪' },
  { code: 'VNM', name: 'Vietnam', flag: '🇻🇳' },
  { code: 'YEM', name: 'Yemen', flag: '🇾🇪' },
  { code: 'ZMB', name: 'Zambia', flag: '🇿🇲' },
  { code: 'ZWE', name: 'Zimbabwe', flag: '🇿🇼' },
];

// Countries supported by the Decodo/Smartproxy scraping API geo parameter
const SCRAPING_COUNTRIES: Country[] = [
  { code: 'AFG', name: 'Afghanistan', flag: '🇦🇫' },
  { code: 'ALB', name: 'Albania', flag: '🇦🇱' },
  { code: 'DZA', name: 'Algeria', flag: '🇩🇿' },
  { code: 'AND', name: 'Andorra', flag: '🇦🇩' },
  { code: 'ATA', name: 'Antarctica', flag: '🇦🇶' },
  { code: 'ARG', name: 'Argentina', flag: '🇦🇷' },
  { code: 'ARM', name: 'Armenia', flag: '🇦🇲' },
  { code: 'AUS', name: 'Australia', flag: '🇦🇺' },
  { code: 'AUT', name: 'Austria', flag: '🇦🇹' },
  { code: 'AZE', name: 'Azerbaijan', flag: '🇦🇿' },
  { code: 'BHS', name: 'Bahamas', flag: '🇧🇸' },
  { code: 'BGD', name: 'Bangladesh', flag: '🇧🇩' },
  { code: 'BLR', name: 'Belarus', flag: '🇧🇾' },
  { code: 'BEL', name: 'Belgium', flag: '🇧🇪' },
  { code: 'BRA', name: 'Brazil', flag: '🇧🇷' },
  { code: 'BGR', name: 'Bulgaria', flag: '🇧🇬' },
  { code: 'KHM', name: 'Cambodia', flag: '🇰🇭' },
  { code: 'CAN', name: 'Canada', flag: '🇨🇦' },
  { code: 'CAF', name: 'Central African Republic', flag: '🇨🇫' },
  { code: 'CHL', name: 'Chile', flag: '🇨🇱' },
  { code: 'CHN', name: 'China', flag: '🇨🇳' },
  { code: 'COL', name: 'Colombia', flag: '🇨🇴' },
  { code: 'COG', name: 'Congo', flag: '🇨🇬' },
  { code: 'CRI', name: 'Costa Rica', flag: '🇨🇷' },
  { code: 'HRV', name: 'Croatia', flag: '🇭🇷' },
  { code: 'CUB', name: 'Cuba', flag: '🇨🇺' },
  { code: 'CYP', name: 'Cyprus', flag: '🇨🇾' },
  { code: 'CZE', name: 'Czechia', flag: '🇨🇿' },
  { code: 'DNK', name: 'Denmark', flag: '🇩🇰' },
  { code: 'DOM', name: 'Dominican Republic', flag: '🇩🇴' },
  { code: 'ECU', name: 'Ecuador', flag: '🇪🇨' },
  { code: 'EGY', name: 'Egypt', flag: '🇪🇬' },
  { code: 'EST', name: 'Estonia', flag: '🇪🇪' },
  { code: 'FIN', name: 'Finland', flag: '🇫🇮' },
  { code: 'FRA', name: 'France', flag: '🇫🇷' },
  { code: 'GEO', name: 'Georgia', flag: '🇬🇪' },
  { code: 'DEU', name: 'Germany', flag: '🇩🇪' },
  { code: 'GHA', name: 'Ghana', flag: '🇬🇭' },
  { code: 'GIB', name: 'Gibraltar', flag: '🇬🇮' },
  { code: 'GRC', name: 'Greece', flag: '🇬🇷' },
  { code: 'GRL', name: 'Greenland', flag: '🇬🇱' },
  { code: 'GIN', name: 'Guinea', flag: '🇬🇳' },
  { code: 'HTI', name: 'Haiti', flag: '🇭🇹' },
  { code: 'HKG', name: 'Hong Kong', flag: '🇭🇰' },
  { code: 'HUN', name: 'Hungary', flag: '🇭🇺' },
  { code: 'ISL', name: 'Iceland', flag: '🇮🇸' },
  { code: 'IND', name: 'India', flag: '🇮🇳' },
  { code: 'IDN', name: 'Indonesia', flag: '🇮🇩' },
  { code: 'IRQ', name: 'Iraq', flag: '🇮🇶' },
  { code: 'IRL', name: 'Ireland', flag: '🇮🇪' },
  { code: 'ISR', name: 'Israel', flag: '🇮🇱' },
  { code: 'ITA', name: 'Italy', flag: '🇮🇹' },
  { code: 'JAM', name: 'Jamaica', flag: '🇯🇲' },
  { code: 'JPN', name: 'Japan', flag: '🇯🇵' },
  { code: 'JEY', name: 'Jersey', flag: '🇯🇪' },
  { code: 'JOR', name: 'Jordan', flag: '🇯🇴' },
  { code: 'KAZ', name: 'Kazakhstan', flag: '🇰🇿' },
  { code: 'KEN', name: 'Kenya', flag: '🇰🇪' },
  { code: 'KIR', name: 'Kiribati', flag: '🇰🇮' },
  { code: 'KOR', name: 'Korea', flag: '🇰🇷' },
  { code: 'KWT', name: 'Kuwait', flag: '🇰🇼' },
  { code: 'LVA', name: 'Latvia', flag: '🇱🇻' },
  { code: 'LTU', name: 'Lithuania', flag: '🇱🇹' },
  { code: 'MEX', name: 'Mexico', flag: '🇲🇽' },
  { code: 'MNG', name: 'Mongolia', flag: '🇲🇳' },
  { code: 'MAR', name: 'Morocco', flag: '🇲🇦' },
  { code: 'NLD', name: 'Netherlands', flag: '🇳🇱' },
  { code: 'NZL', name: 'New Zealand', flag: '🇳🇿' },
  { code: 'NOR', name: 'Norway', flag: '🇳🇴' },
  { code: 'OMN', name: 'Oman', flag: '🇴🇲' },
  { code: 'PAK', name: 'Pakistan', flag: '🇵🇰' },
  { code: 'PAN', name: 'Panama', flag: '🇵🇦' },
  { code: 'PHL', name: 'Philippines', flag: '🇵🇭' },
  { code: 'POL', name: 'Poland', flag: '🇵🇱' },
  { code: 'PRT', name: 'Portugal', flag: '🇵🇹' },
  { code: 'PRI', name: 'Puerto Rico', flag: '🇵🇷' },
  { code: 'QAT', name: 'Qatar', flag: '🇶🇦' },
  { code: 'ROU', name: 'Romania', flag: '🇷🇴' },
  { code: 'RUS', name: 'Russia', flag: '🇷🇺' },
  { code: 'SAU', name: 'Saudi Arabia', flag: '🇸🇦' },
  { code: 'SRB', name: 'Serbia', flag: '🇷🇸' },
  { code: 'SGP', name: 'Singapore', flag: '🇸🇬' },
  { code: 'SVK', name: 'Slovakia', flag: '🇸🇰' },
  { code: 'SVN', name: 'Slovenia', flag: '🇸🇮' },
  { code: 'SOM', name: 'Somalia', flag: '🇸🇴' },
  { code: 'ZAF', name: 'South Africa', flag: '🇿🇦' },
  { code: 'SSD', name: 'South Sudan', flag: '🇸🇸' },
  { code: 'ESP', name: 'Spain', flag: '🇪🇸' },
  { code: 'SWE', name: 'Sweden', flag: '🇸🇪' },
  { code: 'CHE', name: 'Switzerland', flag: '🇨🇭' },
  { code: 'TJK', name: 'Tajikistan', flag: '🇹🇯' },
  { code: 'THA', name: 'Thailand', flag: '🇹🇭' },
  { code: 'TUN', name: 'Tunisia', flag: '🇹🇳' },
  { code: 'TUR', name: 'Turkey', flag: '🇹🇷' },
  { code: 'TKM', name: 'Turkmenistan', flag: '🇹🇲' },
  { code: 'UGA', name: 'Uganda', flag: '🇺🇬' },
  { code: 'UKR', name: 'Ukraine', flag: '🇺🇦' },
  { code: 'ARE', name: 'United Arab Emirates', flag: '🇦🇪' },
  { code: 'GBR', name: 'United Kingdom', flag: '🇬🇧' },
  { code: 'USA', name: 'United States', flag: '🇺🇸' },
  { code: 'URY', name: 'Uruguay', flag: '🇺🇾' },
  { code: 'UZB', name: 'Uzbekistan', flag: '🇺🇿' },
  { code: 'VNM', name: 'Viet Nam', flag: '🇻🇳' },
  { code: 'YEM', name: 'Yemen', flag: '🇾🇪' },
  { code: 'ZWE', name: 'Zimbabwe', flag: '🇿🇼' },
];

const CURRENCIES = [
  { code: 'EUR', symbol: '€', name: 'Euro' },
  { code: 'USD', symbol: '$', name: 'US Dollar' },
  { code: 'GBP', symbol: '£', name: 'British Pound' },
  { code: 'CHF', symbol: 'CHF', name: 'Swiss Franc' },
  { code: 'JPY', symbol: '¥', name: 'Japanese Yen' },
  { code: 'AUD', symbol: 'A$', name: 'Australian Dollar' },
  { code: 'CAD', symbol: 'C$', name: 'Canadian Dollar' },
  { code: 'SEK', symbol: 'kr', name: 'Swedish Krona' },
  { code: 'NOK', symbol: 'kr', name: 'Norwegian Krone' },
  { code: 'DKK', symbol: 'kr', name: 'Danish Krone' },
  { code: 'PLN', symbol: 'zł', name: 'Polish Zloty' },
  { code: 'CZK', symbol: 'Kč', name: 'Czech Koruna' },
  { code: 'HUF', symbol: 'Ft', name: 'Hungarian Forint' },
  { code: 'RON', symbol: 'lei', name: 'Romanian Leu' },
  { code: 'BGN', symbol: 'лв', name: 'Bulgarian Lev' },
  { code: 'TRY', symbol: '₺', name: 'Turkish Lira' },
  { code: 'RUB', symbol: '₽', name: 'Russian Ruble' },
  { code: 'INR', symbol: '₹', name: 'Indian Rupee' },
  { code: 'CNY', symbol: '¥', name: 'Chinese Yuan' },
  { code: 'KRW', symbol: '₩', name: 'South Korean Won' },
  { code: 'BRL', symbol: 'R$', name: 'Brazilian Real' },
  { code: 'MXN', symbol: 'MX$', name: 'Mexican Peso' },
  { code: 'ZAR', symbol: 'R', name: 'South African Rand' },
  { code: 'AED', symbol: 'د.إ', name: 'UAE Dirham' },
  { code: 'THB', symbol: '฿', name: 'Thai Baht' },
  { code: 'MKD', symbol: 'ден', name: 'Macedonian Denar' },
  { code: 'RSD', symbol: 'дин', name: 'Serbian Dinar' },
];

interface SearchSlot {
  id: number;
  url: string;
  priceResults: PriceResult[];
}

let slotIdCounter = 1;

export default function ProxyInterface() {
  const { token, logout, user, credentials, googleCredential } = useAuthStore();
  const [deviceMode] = useState<DeviceMode>('desktop');
  const [selectedCountries, setSelectedCountries] = useState<Country[]>([SCRAPING_COUNTRIES.find(c => c.code === 'SRB')!]);
  const [selectedCurrency, setSelectedCurrency] = useState(CURRENCIES[0]); // EUR default
  const [showCurrencyPicker, setShowCurrencyPicker] = useState(false);
  const currencyPickerRef = useRef<HTMLDivElement>(null);
  const [showCountryPicker, setShowCountryPicker] = useState(false);
  const [countrySearch, setCountrySearch] = useState('');
  const countryPickerRef = useRef<HTMLDivElement>(null);
  const [currentUrl, setCurrentUrl] = useState('');
  const [error, setError] = useState('');
  const [logs, setLogs] = useState<string[]>([]);
  const [html, setHtml] = useState('');
  const [screenshot, setScreenshot] = useState('');
  const [htmlVersion, setHtmlVersion] = useState(0);
  const [showPreview, setShowPreview] = useState(false);
  const [showLogs, setShowLogs] = useState(false);
  const [slots, setSlots] = useState<SearchSlot[]>([{ id: slotIdCounter++, url: '', priceResults: [] }]);
  const [liteMode, setLiteMode] = useState(true);
  const [advancedMode, setAdvancedMode] = useState(false);
  const [localOnly, setLocalOnly] = useState(true);
  const [previewEndpointIdx, setPreviewEndpointIdx] = useState(0);
  const [activeSlotId, setActiveSlotId] = useState<number | null>(null);
  const [showHowItWorks, setShowHowItWorks] = useState(false);
  const [useScrapingApi, setUseScrapingApi] = useState(true);
  const [scrapeMobile, setScrapeMobile] = useState(false);
  const [savedBrowserCountries, setSavedBrowserCountries] = useState<Country[]>([]);
  const [savedScrapingCountries, setSavedScrapingCountries] = useState<Country[]>([]);
  const wsRef = useRef<WebSocket | null>(null);

  const addLog = (message: string) => {
    setLogs((prev) => [...prev.slice(-19), `[${new Date().toLocaleTimeString()}] ${message}`]);
  };

  // Close country picker and currency picker on click outside
  useEffect(() => {
    const handleClickOutside = (e: MouseEvent) => {
      if (countryPickerRef.current && !countryPickerRef.current.contains(e.target as Node)) {
        setShowCountryPicker(false);
        setCountrySearch('');
      }
      if (currencyPickerRef.current && !currencyPickerRef.current.contains(e.target as Node)) {
        setShowCurrencyPicker(false);
      }
    };
    document.addEventListener('mousedown', handleClickOutside);
    return () => document.removeEventListener('mousedown', handleClickOutside);
  }, []);

  const toggleCountry = (country: Country) => {
    setSelectedCountries(prev => {
      const exists = prev.find(c => c.code === country.code);
      if (exists) {
        if (prev.length === 1) return prev; // keep at least one
        return prev.filter(c => c.code !== country.code);
      }
      if (prev.length >= 3) return prev; // max 3
      return [...prev, country];
    });
  };

  const activeCountryList = useScrapingApi ? SCRAPING_COUNTRIES : COUNTRIES;
  const filteredCountries = activeCountryList.filter(c =>
    c.name.toLowerCase().includes(countrySearch.toLowerCase()) ||
    c.code.toLowerCase().includes(countrySearch.toLowerCase())
  );

  // Initialize WebSocket connection
  useEffect(() => {
    if (!token) return;

    const ws = new WebSocket(`${WS_URL}/ws`);
    wsRef.current = ws;

    ws.onopen = () => {
      addLog('WebSocket connected');
      // Authenticate
      ws.send(JSON.stringify({ type: 'auth', token }));
    };

    ws.onmessage = (event) => {
      try {
        const data = JSON.parse(event.data);

        switch (data.type) {
          case 'connected':
            addLog('Connected to server');
            break;

          case 'authenticated':
            addLog(`Authenticated as ${data.user.email}`);
            break;

          case 'subscribed':
            addLog(`Subscribed to session ${data.sessionId}`);
            setCurrentUrl(data.state.currentUrl);
            break;

          case 'update':
            addLog(`Update: ${data.update.type}`);
            if (data.update.type === 'navigation') {
              setCurrentUrl(data.update.data.url);
            }
            if (data.update.type === 'html_snapshot') {
              // Increment version to trigger iframe reload
              setHtmlVersion(prev => prev + 1);
            }
            break;

          case 'navigation_complete':
            addLog(`Navigation complete: ${data.url}`);
            setCurrentUrl(data.currentUrl);
            break;

          case 'error':
            addLog(`Error: ${data.message}`);
            setError(data.message);
            break;

          default:
            addLog(`Unknown message: ${data.type}`);
        }
      } catch (err) {
        console.error('Failed to parse message:', err);
      }
    };

    ws.onerror = (err) => {
      addLog('WebSocket error');
      console.error('WebSocket error:', err);
    };

    ws.onclose = () => {
      addLog('WebSocket disconnected');
    };

    return () => {
      if (ws.readyState === WebSocket.OPEN) {
        ws.close();
      }
    };
  }, [token]);

  // Slot helpers
  const addSlot = () => {
    if (slots.length >= 6) return;
    setSlots(prev => [...prev, { id: slotIdCounter++, url: '', priceResults: [] }]);
  };

  const removeSlot = (slotId: number) => {
    if (slots.length <= 1) return;
    setSlots(prev => prev.filter(s => s.id !== slotId));
    if (activeSlotId === slotId) setActiveSlotId(null);
  };

  const updateSlotUrl = (slotId: number, newUrl: string) => {
    setSlots(prev => prev.map(s => s.id === slotId ? { ...s, url: newUrl } : s));
  };

  const updateSlotResults = (slotId: number, updater: (prev: PriceResult[]) => PriceResult[]) => {
    setSlots(prev => prev.map(s => s.id === slotId ? { ...s, priceResults: updater(s.priceResults) } : s));
  };

  // Helper: get the currently selected preview endpoint's session info
  const activeSlot = slots.find(s => s.id === activeSlotId) || null;
  const getPreviewSession = () => activeSlot?.priceResults[previewEndpointIdx] || null;
  const hasAnySession = activeSlot?.priceResults.some(r => r.sessionId) || false;

  const fetchHtml = async () => {
    const ps = getPreviewSession();
    if (!ps?.sessionId || !ps.sessionToken) return;

    try {
      const response = await axios.get(
        `${ps.apiUrl}/api/proxy/session/${ps.sessionId}/html`,
        { headers: { Authorization: `Bearer ${ps.sessionToken}` } }
      );

      setHtml(response.data);
      addLog(`[${ps.label}] HTML fetched`);
    } catch (err: any) {
      setError(err.response?.data?.error || 'Failed to fetch HTML');
    }
  };

  const fetchScreenshot = async () => {
    const ps = getPreviewSession();
    if (!ps?.sessionId || !ps.sessionToken) return;

    try {
      const response = await axios.get(
        `${ps.apiUrl}/api/proxy/session/${ps.sessionId}/screenshot`,
        { headers: { Authorization: `Bearer ${ps.sessionToken}` }, responseType: 'blob' }
      );

      const imageUrl = URL.createObjectURL(response.data);
      setScreenshot(imageUrl);
      addLog(`[${ps.label}] Screenshot captured`);
    } catch (err: any) {
      setError(err.response?.data?.error || 'Failed to capture screenshot');
    }
  };

  const closeSession = async () => {
    const ps = getPreviewSession();
    if (!ps?.sessionId || !ps.sessionToken || !activeSlotId) return;

    try {
      await axios.delete(`${ps.apiUrl}/api/proxy/session/${ps.sessionId}`, {
        headers: { Authorization: `Bearer ${ps.sessionToken}` },
      });

      updateSlotResults(activeSlotId, prev => prev.map((r, i) =>
        i === previewEndpointIdx ? { ...r, sessionId: null, sessionToken: null } : r
      ));
      setCurrentUrl('');
      setHtml('');
      setScreenshot('');
      setHtmlVersion(0);
      addLog(`[${ps.label}] Session closed`);
    } catch (err: any) {
      setError(err.response?.data?.error || 'Failed to close session');
    }
  };

  const isSlotExtracting = (slot: SearchSlot) => slot.priceResults.some(r => r.loading);
  const anyExtracting = slots.some(s => isSlotExtracting(s));

  const extractPrice = async (slotId: number) => {
    setError('');
    const slot = slots.find(s => s.id === slotId);
    if (!slot || !slot.url.trim()) return;

    setActiveSlotId(slotId);

    // Filter endpoints based on localOnly toggle
    const endpoints = localOnly ? activeEndpoints.filter(ep => ep.devOnly) : activeEndpoints;

    // Initialize results with loading state
    const initial: PriceResult[] = endpoints.map(ep => ({
      label: ep.label,
      apiUrl: ep.apiUrl,
      sessionId: null,
      sessionToken: null,
      data: null,
      loading: true,
      error: null,
    }));
    updateSlotResults(slotId, () => initial);
    setPreviewEndpointIdx(0);

    const fetchOne = async (ep: PriceEndpoint, index: number) => {
      try {
        let epToken = token!;
        if (ep.apiUrl !== API_URL) {
          if (credentials) {
            const loginRes = await axios.post(`${ep.apiUrl}/api/auth/login`, {
              email: credentials.email,
              password: credentials.password,
            });
            epToken = loginRes.data.token;
          } else if (googleCredential) {
            const loginRes = await axios.post(`${ep.apiUrl}/api/auth/google`, {
              credential: googleCredential,
            });
            epToken = loginRes.data.token;
          }
        }

        const authHeaders = { Authorization: `Bearer ${epToken}` };

        const createRes = await axios.post(
          `${ep.apiUrl}/api/proxy/session/create`,
          { deviceMode, url: slot.url, currency: selectedCurrency.code },
          { headers: authHeaders }
        );

        const epSessionId = createRes.data.sessionId;

        updateSlotResults(slotId, prev => prev.map((r, i) =>
          i === index ? { ...r, sessionId: epSessionId, sessionToken: epToken } : r
        ));

        if (index === 0) {
          setCurrentUrl(createRes.data.currentUrl);
          addLog(`Session created: ${epSessionId}`);
          if (wsRef.current?.readyState === WebSocket.OPEN) {
            wsRef.current.send(
              JSON.stringify({ type: 'subscribe', sessionId: epSessionId })
            );
          }
        }

        const response = await axios.post(
          `${ep.apiUrl}/api/proxy/session/${epSessionId}/extract-price`,
          { liteMode },
          { headers: authHeaders }
        );

        const providerLabels: Record<string, string> = { hotels: 'Hotels.com', expedia: 'Expedia', vrbo: 'VRBO', airbnb: 'Airbnb', booking: 'Booking', agoda: 'Agoda', trip: 'Trip.com', hostelworld: 'Hostelworld', homestay: 'Homestay', travelocity: 'Travelocity', casasrurales: 'CasasRurales', hometogo: 'HomeToGo', plumguide: 'Plum Guide', hipcamp: 'Hipcamp', misterbandb: 'Misterb&b', redawning: 'RedAwning', ostrovok: 'Ostrovok', fliggy: 'Fliggy', makemytrip: 'MakeMyTrip', oyo: 'OYO', goibibo: 'Goibibo', cleartrip: 'Cleartrip', yatra: 'Yatra' };
        const providerTag = response.data.provider && providerLabels[response.data.provider] ? ` [${providerLabels[response.data.provider]}]` : '';
        addLog(`[${ep.label}]${providerTag} Price extracted — Desktop: ${response.data.desktop.currency}${response.data.desktop.price}, Mobile: ${response.data.mobile.currency}${response.data.mobile.price}`);

        updateSlotResults(slotId, prev => prev.map((r, i) =>
          i === index ? { ...r, data: response.data, loading: false } : r
        ));
      } catch (err: any) {
        const msg = err.response?.data?.error || err.message || 'Failed to extract price';
        addLog(`[${ep.label}] Error: ${msg}`);
        updateSlotResults(slotId, prev => prev.map((r, i) =>
          i === index ? { ...r, error: msg, loading: false } : r
        ));
      }
    };

    await Promise.allSettled(endpoints.map((ep, i) => fetchOne(ep, i)));
  };

  const extractPriceWithScraper = async (slotId: number) => {
    setError('');
    const slot = slots.find(s => s.id === slotId);
    if (!slot || !slot.url.trim()) return;

    setActiveSlotId(slotId);

    // Use selected countries as geo targets
    const geos = selectedCountries.map(c => ({ label: c.name, geo: c.name }));

    // Initialize results with loading state (one per geo)
    const initial: PriceResult[] = geos.map(g => ({
      label: g.label,
      apiUrl: API_URL,
      sessionId: null,
      sessionToken: null,
      data: null,
      loading: true,
      error: null,
    }));
    updateSlotResults(slotId, () => initial);
    setPreviewEndpointIdx(0);

    const fetchOne = async (g: { label: string; geo: string }, index: number) => {
      try {
        const authHeaders = { Authorization: `Bearer ${token}` };

        const response = await axios.post(
          `${API_URL}/api/proxy/scrape-price`,
          { url: slot.url, geo: g.geo, currency: selectedCurrency.code, includeMobile: scrapeMobile },
          { headers: authHeaders }
        );

        const providerLabels: Record<string, string> = { hotels: 'Hotels.com', expedia: 'Expedia', vrbo: 'VRBO', airbnb: 'Airbnb', booking: 'Booking', agoda: 'Agoda', trip: 'Trip.com', hostelworld: 'Hostelworld', homestay: 'Homestay', travelocity: 'Travelocity', casasrurales: 'CasasRurales', hometogo: 'HomeToGo', plumguide: 'Plum Guide', hipcamp: 'Hipcamp', misterbandb: 'Misterb&b', redawning: 'RedAwning', ostrovok: 'Ostrovok', fliggy: 'Fliggy', makemytrip: 'MakeMyTrip', oyo: 'OYO', goibibo: 'Goibibo', cleartrip: 'Cleartrip', yatra: 'Yatra' };
        const providerTag = response.data.provider && providerLabels[response.data.provider] ? ` [${providerLabels[response.data.provider]}]` : '';
        addLog(`[${g.label}]${providerTag} Scraped — Desktop: ${response.data.desktop.currency}${response.data.desktop.price}, Mobile: ${response.data.mobile.currency}${response.data.mobile.price}`);

        updateSlotResults(slotId, prev => prev.map((r, i) =>
          i === index ? { ...r, data: response.data, loading: false } : r
        ));
      } catch (err: any) {
        const msg = err.response?.data?.error || err.message || 'Failed to scrape price';
        addLog(`[${g.label}] Error: ${msg}`);
        updateSlotResults(slotId, prev => prev.map((r, i) =>
          i === index ? { ...r, error: msg, loading: false } : r
        ));
      }
    };

    await Promise.allSettled(geos.map((g, i) => fetchOne(g, i)));
  };

  const handlePreviewInteraction = (event: any) => {
    const ps = getPreviewSession();
    if (!ps?.sessionId || !wsRef.current || wsRef.current.readyState !== WebSocket.OPEN) return;

    if (event.type === 'preview_navigate') {
      addLog(`Navigating to ${event.url}`);
      wsRef.current.send(JSON.stringify({ type: 'navigate', url: event.url }));
    } else {
      const { type: eventType, ...eventData } = event;
      addLog(`Preview interaction: ${eventType}`);
      wsRef.current.send(JSON.stringify({ type: 'preview_interact', eventType, ...eventData }));
    }
  };

  return (
    <div className="min-h-screen p-4 md:p-6">
      <div className="max-w-7xl mx-auto space-y-5">

        {/* ── Header bar ── */}
        <header className="bg-white rounded-2xl shadow-sm border border-gray-100 px-5 py-4 flex items-center justify-between">
          <div className="flex items-center gap-3">
            <Image src={waylowLogo} alt="waylow.world" className="w-10 h-10" width={40} height={40} />
            <div className="hidden sm:block leading-tight">
              <span className="text-lg font-bold text-brand-navy">waylow</span>
              <span className="text-lg font-bold text-brand-teal">.world</span>
              <p className="text-[11px] text-gray-400 -mt-0.5">the world at low price</p>
            </div>
          </div>
          <div className="flex items-center gap-3">
            <span className="text-xs text-gray-400 hidden sm:inline">{user?.email}</span>
            <button
              onClick={logout}
              className="px-3 py-1.5 text-xs font-medium text-gray-500 hover:text-brand-navy bg-gray-50 hover:bg-gray-100 rounded-lg border border-gray-200"
            >
              Sign out
            </button>
          </div>
        </header>

        {/* ── Global controls (country picker + currency) ── */}
        <div className="bg-white rounded-2xl shadow-sm border border-gray-100 px-5 py-3" ref={countryPickerRef}>
          <div className="flex items-center gap-2">
            <button
              onClick={() => { setShowCountryPicker(!showCountryPicker); setShowCurrencyPicker(false); setCountrySearch(''); }}
              className="px-3 py-2 border border-gray-200 rounded-xl bg-gray-50 hover:bg-gray-100 flex items-center gap-1.5 shrink-0 text-sm"
            >
              {selectedCountries.map(c => (
                <span key={c.code} title={c.name} className="whitespace-nowrap">{c.flag} {c.code}</span>
              ))}
              <svg className="w-3 h-3 text-gray-400 ml-1" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" /></svg>
            </button>

            <div ref={currencyPickerRef} className="relative">
              <button
                onClick={() => { setShowCurrencyPicker(!showCurrencyPicker); setShowCountryPicker(false); }}
                className="px-3 py-2 border border-gray-200 rounded-xl bg-gray-50 hover:bg-gray-100 flex items-center gap-1.5 shrink-0 text-sm"
              >
                <span>{selectedCurrency.symbol} {selectedCurrency.code}</span>
                <svg className="w-3 h-3 text-gray-400 ml-1" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" /></svg>
              </button>
              {showCurrencyPicker && (
                <div className="absolute top-full left-0 mt-1 z-20 border border-gray-200 rounded-xl bg-white shadow-lg overflow-hidden w-56">
                  <div className="max-h-64 overflow-y-auto p-1">
                    {CURRENCIES.map(cur => (
                      <button
                        key={cur.code}
                        onClick={() => { setSelectedCurrency(cur); setShowCurrencyPicker(false); }}
                        className={`w-full flex items-center gap-2 px-3 py-2 text-sm text-left rounded-lg hover:bg-gray-50 ${
                          cur.code === selectedCurrency.code ? 'bg-brand-teal/10 font-medium' : ''
                        }`}
                      >
                        <span className="text-gray-500 w-8">{cur.symbol}</span>
                        <span>{cur.code}</span>
                        <span className="text-gray-400 text-xs ml-auto">{cur.name}</span>
                      </button>
                    ))}
                  </div>
                </div>
              )}
            </div>

            <label className="flex items-center gap-1.5 px-3 py-2 border border-gray-200 rounded-xl bg-gray-50 cursor-pointer select-none shrink-0">
              <input
                type="checkbox"
                checked={!localOnly}
                onChange={(e) => setLocalOnly(!e.target.checked)}
                className="accent-brand-navy rounded"
              />
              <span className="text-xs font-medium text-gray-600">All APIs</span>
            </label>

            <label className="flex items-center gap-1.5 px-3 py-2 border border-gray-200 rounded-xl bg-gray-50 cursor-pointer select-none shrink-0">
              <input
                type="checkbox"
                checked={advancedMode}
                onChange={(e) => setAdvancedMode(e.target.checked)}
                className="accent-brand-navy rounded"
              />
              <span className="text-xs font-medium text-gray-600">Advanced</span>
            </label>

            <label className="flex items-center gap-1.5 px-3 py-2 border border-gray-200 rounded-xl bg-gray-50 cursor-pointer select-none shrink-0">
              <input
                type="checkbox"
                checked={useScrapingApi}
                onChange={(e) => {
                  const goingScraping = e.target.checked;
                  if (goingScraping) {
                    setSavedBrowserCountries(selectedCountries);
                    const restored = savedScrapingCountries.length > 0
                      ? savedScrapingCountries
                      : [SCRAPING_COUNTRIES.find(c => c.code === 'SRB')!];
                    setSelectedCountries(restored);
                  } else {
                    setSavedScrapingCountries(selectedCountries);
                    const restored = savedBrowserCountries.length > 0
                      ? savedBrowserCountries
                      : [COUNTRIES.find(c => c.code === 'MKD')!];
                    setSelectedCountries(restored);
                  }
                  setUseScrapingApi(goingScraping);
                }}
                className="accent-brand-navy rounded"
              />
              <span className="text-xs font-medium text-gray-600">Scraping API</span>
            </label>

            {useScrapingApi && (
              <label className="flex items-center gap-1.5 px-3 py-2 border border-gray-200 rounded-xl bg-gray-50 cursor-pointer select-none shrink-0">
                <input
                  type="checkbox"
                  checked={scrapeMobile}
                  onChange={(e) => setScrapeMobile(e.target.checked)}
                  className="accent-brand-navy rounded"
                />
                <span className="text-xs font-medium text-gray-600">Mobile</span>
              </label>
            )}

            {slots.length < 6 && (
              <button
                onClick={addSlot}
                className="px-3 py-2 text-xs font-semibold text-brand-teal bg-brand-teal/10 hover:bg-brand-teal/20 rounded-xl border border-brand-teal/20"
              >
                + Add
              </button>
            )}

            {slots.length >= 6 && (
              <span className="text-[11px] text-gray-400">Max 6 comparisons</span>
            )}
          </div>

          {showCountryPicker && (
            <div className="mt-3 border border-gray-200 rounded-xl bg-white shadow-lg overflow-hidden">
              <div className="p-3 border-b border-gray-100 bg-gray-50">
                <input
                  type="text"
                  value={countrySearch}
                  onChange={(e) => setCountrySearch(e.target.value)}
                  placeholder="Search countries..."
                  className="w-full px-3 py-2 border border-gray-200 rounded-lg text-sm bg-white focus:ring-2 focus:ring-brand-teal/30 focus:border-brand-teal"
                  autoFocus
                />
                <p className="text-[11px] text-gray-400 mt-1.5">Select up to 3 regions. {selectedCountries.length}/3 selected.</p>
              </div>
              <div className="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-6 gap-1 p-2 max-h-64 overflow-y-auto">
                {filteredCountries.map(country => {
                  const isSelected = selectedCountries.some(c => c.code === country.code);
                  return (
                    <button
                      key={country.code}
                      onClick={() => toggleCountry(country)}
                      className={`flex items-center gap-1.5 px-2 py-1.5 rounded-lg text-sm text-left hover:bg-gray-50 ${
                        isSelected ? 'bg-brand-teal/10 border border-brand-teal/30 font-medium' : 'border border-transparent'
                      } ${!isSelected && selectedCountries.length >= 3 ? 'opacity-30 cursor-not-allowed' : ''}`}
                    >
                      <span>{country.flag}</span>
                      <span className="truncate">{country.name}</span>
                    </button>
                  );
                })}
              </div>
            </div>
          )}
        </div>

        {/* ── Tagline + CTA ── */}
        <div className="flex items-center justify-center gap-3 px-4">
          <p className="text-sm text-gray-500 italic">Make the right move for your next adventure.</p>
          <button
            onClick={() => setShowHowItWorks(true)}
            className="text-sm font-semibold text-brand-teal hover:text-brand-teal/80 underline underline-offset-2 shrink-0"
          >
            How does it work?
          </button>
        </div>

        {/* ── Error ── */}
        {error && (
          <div className="bg-red-50 border border-red-200 text-red-700 px-4 py-3 rounded-xl text-sm">
            {error}
          </div>
        )}

        {/* ── Search slots ── */}
        {slots.map((slot, slotIdx) => {
          const extracting = isSlotExtracting(slot);
          return (
            <div key={slot.id} className="bg-white rounded-2xl shadow-sm border border-gray-100 p-5 space-y-4">
              {/* Search bar */}
              <div className="flex flex-col sm:flex-row gap-2">
                <input
                  type="url"
                  value={slot.url}
                  onChange={(e) => updateSlotUrl(slot.id, e.target.value)}
                  placeholder="Paste a Booking.com or Hotels.com hotel link..."
                  className="flex-1 px-4 py-2.5 border border-gray-200 rounded-xl bg-gray-50 focus:bg-white focus:ring-2 focus:ring-brand-teal/30 focus:border-brand-teal text-sm"
                />

                <button
                  onClick={() => useScrapingApi ? extractPriceWithScraper(slot.id) : extractPrice(slot.id)}
                  disabled={extracting || !slot.url.trim()}
                  className="px-5 py-2.5 bg-brand-teal hover:bg-brand-teal-dark text-white font-semibold rounded-xl disabled:opacity-50 whitespace-nowrap text-sm shadow-sm shadow-brand-teal/20"
                >
                  {extracting ? (
                    <span className="flex items-center gap-2">
                      <svg className="animate-spin h-4 w-4" viewBox="0 0 24 24"><circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4" fill="none"/><path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"/></svg>
                      {useScrapingApi ? 'Scraping...' : 'Browsing...'}
                    </span>
                  ) : useScrapingApi ? 'Scrape Price' : 'Browse Price'}
                </button>

                {slots.length > 1 && (
                  <button
                    onClick={() => removeSlot(slot.id)}
                    className="px-3 py-2.5 text-xs font-medium text-red-500 hover:text-red-700 bg-red-50 hover:bg-red-100 rounded-xl border border-red-200 shrink-0"
                    title="Remove"
                  >
                    <svg className="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" /></svg>
                  </button>
                )}
              </div>

              {/* Results for this slot */}
              {slot.priceResults.length > 0 && (
                <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3">
                  {slot.priceResults.map((result, idx) => (
                    <div key={idx} className={`rounded-xl p-4 border ${
                      result.loading ? 'bg-gray-50 border-brand-teal/20' :
                      result.error ? 'bg-red-50 border-red-200' :
                      result.data && (result.data.desktop.price || result.data.mobile.price) ? 'bg-gray-50 border-brand-teal/30' :
                      'bg-amber-50 border-amber-200'
                    }`}>
                      <div className="flex items-center gap-2 mb-2">
                        <div className={`w-1.5 h-1.5 rounded-full ${
                          result.loading ? 'bg-brand-teal animate-pulse' :
                          result.error ? 'bg-red-400' :
                          result.data?.desktop.price ? 'bg-brand-teal' : 'bg-amber-400'
                        }`} />
                        <h3 className="text-xs font-bold text-brand-navy">{result.label}</h3>
                      </div>

                      {result.loading && (
                        <div className="animate-pulse space-y-2">
                          <div className="h-3 bg-gray-200 rounded-full w-28"></div>
                          <div className="h-7 bg-gray-200 rounded-full w-24"></div>
                          <div className="h-3 bg-gray-200 rounded-full w-20"></div>
                        </div>
                      )}

                      {result.error && (
                        <p className="text-xs text-red-600">{result.error}</p>
                      )}

                      {!result.loading && !result.error && result.data && !result.data.desktop.price && !result.data.mobile.price && (
                        <p className="text-xs text-amber-700">
                          Price not found on {result.data.provider === 'hotels' ? 'Hotels.com' : result.data.provider === 'airbnb' ? 'Airbnb' : result.data.provider === 'cleartrip' ? 'Cleartrip' : result.data.provider === 'makemytrip' ? 'MakeMyTrip' : result.data.provider === 'goibibo' ? 'Goibibo' : result.data.provider === 'expedia' ? 'Expedia' : result.data.provider === 'agoda' ? 'Agoda' : result.data.provider === 'trip' ? 'Trip.com' : (result.data.provider ?? 'unknown').charAt(0).toUpperCase() + (result.data.provider ?? 'unknown').slice(1)}.
                        </p>
                      )}

                      {!result.loading && !result.error && result.data && (result.data.desktop.price || result.data.mobile.price) && (
                        <>
                          {(result.data.provider === 'hotels' || result.data.provider === 'airbnb') && (
                            <p className="text-[10px] font-bold text-brand-teal uppercase tracking-widest mb-1">Starting from</p>
                          )}
                          <div className="mb-2">
                            <p className="text-[10px] font-semibold text-gray-400 uppercase tracking-wide mb-0.5">Desktop</p>
                            {result.data.desktop.description && (
                              <p className="text-[11px] text-gray-500 mb-0.5">{result.data.desktop.description}</p>
                            )}
                            <p className="text-2xl font-extrabold text-brand-navy">
                              {result.data.desktop.currency}{result.data.desktop.price || '\u2014'}
                            </p>
                          </div>
                          <div className="mb-2">
                            <p className="text-[10px] font-semibold text-gray-400 uppercase tracking-wide mb-0.5">Mobile</p>
                            {result.data.mobile.description && (
                              <p className="text-[11px] text-gray-500 mb-0.5">{result.data.mobile.description}</p>
                            )}
                            <p className="text-lg font-bold text-gray-500">
                              {result.data.mobile.currency}{result.data.mobile.price || '\u2014'}
                            </p>
                          </div>

                          {(result.data.provider === 'hotels' || result.data.provider === 'airbnb') ? (
                            <p className="text-[11px] text-brand-teal-dark font-medium">Lowest non-discounted price</p>
                          ) : result.data.reserveUrl ? (
                            <>
                              <p className="text-[11px] text-gray-500 mb-2"><span className="font-semibold text-brand-navy">Remember:</span> personal discounts still apply.</p>
                              <a
                                href={result.data.reserveUrl}
                                target="_blank"
                                rel="noopener noreferrer"
                                className="inline-block px-3 py-1.5 bg-brand-teal hover:bg-brand-teal-dark text-white rounded-lg text-xs font-semibold shadow-sm"
                              >
                                Reserve
                              </a>
                            </>
                          ) : (
                            <p className="text-[11px] text-gray-400">No reserve link</p>
                          )}

                          {result.data.traffic && (
                            <div className="mt-2 pt-2 border-t border-gray-100 flex gap-3 text-[10px] text-gray-400">
                              <span>{result.data.traffic.totalBytes >= 1048576
                                ? `${(result.data.traffic.totalBytes / 1048576).toFixed(1)} MB`
                                : `${(result.data.traffic.totalBytes / 1024).toFixed(0)} KB`}
                              </span>
                              <span>{result.data.traffic.requestCount} reqs</span>
                            </div>
                          )}
                        </>
                      )}
                    </div>
                  ))}
                </div>
              )}
            </div>
          );
        })}

        {/* ── Advanced tools ── */}
        {advancedMode && hasAnySession && (
          <div className="bg-white rounded-2xl shadow-sm border border-gray-100 p-5 space-y-2">
            <div className="flex items-center gap-2 flex-wrap">
              <span className="text-[11px] font-medium text-gray-400 uppercase tracking-wide">Endpoint:</span>
              {(activeSlot?.priceResults || []).map((r, idx) => (
                <button
                  key={idx}
                  onClick={() => setPreviewEndpointIdx(idx)}
                  disabled={!r.sessionId}
                  className={`px-2.5 py-1 text-xs font-medium rounded-lg border ${
                    idx === previewEndpointIdx
                      ? 'bg-brand-navy text-white border-brand-navy'
                      : r.sessionId
                        ? 'text-gray-600 bg-gray-50 hover:bg-gray-100 border-gray-200'
                        : 'text-gray-300 bg-gray-50 border-gray-100 cursor-not-allowed'
                  }`}
                >
                  {r.label}
                </button>
              ))}
            </div>
            <div className="flex flex-wrap gap-2">
              <label className="flex items-center gap-1.5 px-3 py-1.5 border border-gray-200 rounded-lg bg-gray-50 cursor-pointer select-none">
                <input
                  type="checkbox"
                  checked={liteMode}
                  onChange={(e) => setLiteMode(e.target.checked)}
                  className="accent-brand-teal rounded"
                />
                <span className="text-xs font-medium text-gray-600">Lite</span>
              </label>
              <button onClick={fetchHtml} className="px-3 py-1.5 text-xs font-medium text-gray-600 bg-gray-50 hover:bg-gray-100 rounded-lg border border-gray-200">
                Get HTML
              </button>
              <button onClick={fetchScreenshot} className="px-3 py-1.5 text-xs font-medium text-gray-600 bg-gray-50 hover:bg-gray-100 rounded-lg border border-gray-200">
                Screenshot
              </button>
              <button onClick={() => setShowPreview(!showPreview)} className="px-3 py-1.5 text-xs font-medium text-brand-navy bg-brand-navy/5 hover:bg-brand-navy/10 rounded-lg border border-brand-navy/20">
                {showPreview ? 'Hide' : 'Show'} Preview
              </button>
              <button onClick={() => setShowLogs(!showLogs)} className="px-3 py-1.5 text-xs font-medium text-gray-600 bg-gray-50 hover:bg-gray-100 rounded-lg border border-gray-200">
                {showLogs ? 'Hide' : 'Show'} Logs
              </button>
              <button onClick={closeSession} className="px-3 py-1.5 text-xs font-medium text-red-600 bg-red-50 hover:bg-red-100 rounded-lg border border-red-200 ml-auto">
                Close Session
              </button>
            </div>
          </div>
        )}

        {/* ── Secondary panels ── */}
        <div className="grid grid-cols-1 lg:grid-cols-2 gap-5">
          {showLogs && (
            <div className="bg-white rounded-2xl shadow-sm border border-gray-100 p-5">
              <h2 className="text-sm font-bold text-brand-navy mb-3">Activity Log</h2>
              <div className="log-panel bg-brand-navy text-brand-teal-light p-4 rounded-xl font-mono text-[11px] h-80 overflow-y-auto leading-relaxed">
                {logs.map((log, i) => (
                  <div key={i} className="py-0.5">{log}</div>
                ))}
              </div>
            </div>
          )}

          {screenshot && (
            <div className="bg-white rounded-2xl shadow-sm border border-gray-100 p-5">
              <h2 className="text-sm font-bold text-brand-navy mb-3">Screenshot</h2>
              <div className="border border-gray-200 rounded-xl overflow-hidden">
                <img src={screenshot} alt="Screenshot" className="w-full" />
              </div>
            </div>
          )}

          {html && (
            <div className="bg-white rounded-2xl shadow-sm border border-gray-100 p-5 lg:col-span-2">
              <h2 className="text-sm font-bold text-brand-navy mb-3">HTML Content</h2>
              <pre className="bg-brand-navy text-gray-300 p-4 rounded-xl text-[11px] overflow-x-auto max-h-80 overflow-y-auto">
                {html}
              </pre>
            </div>
          )}
        </div>

        {/* ── Live Preview ── */}
        {showPreview && getPreviewSession()?.sessionId && (
          <div className="bg-white rounded-2xl shadow-sm border border-gray-100 p-5">
            <LivePreview
              sessionId={getPreviewSession()!.sessionId!}
              token={getPreviewSession()!.sessionToken!}
              apiUrl={getPreviewSession()!.apiUrl}
              htmlVersion={htmlVersion}
              onInteraction={handlePreviewInteraction}
              isVisible={true}
              currentUrl={currentUrl}
            />
          </div>
        )}
      </div>

      {/* ── How It Works Modal ── */}
      {showHowItWorks && (
        <div className="fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4" onClick={() => setShowHowItWorks(false)}>
          <div
            className="bg-white rounded-2xl shadow-2xl max-w-2xl w-full max-h-[85vh] overflow-y-auto p-8 relative"
            onClick={(e) => e.stopPropagation()}
          >
            <button
              onClick={() => setShowHowItWorks(false)}
              className="absolute top-4 right-4 text-gray-400 hover:text-gray-600 text-xl leading-none"
              aria-label="Close"
            >
              &times;
            </button>

            <p className="text-gray-600 leading-relaxed mb-6">
              Whether you&apos;re wrapping up a business trip, lingering on a beach, or already plotting your next getaway, knowing when to book can be just as strategic as knowing where to go. This app removes the uncertainty from travel planning by letting you compare the advantages of booking from your current destination versus waiting until you&apos;re back home. Powered by smart insights, clear comparisons, and traveler-friendly guidance, it helps every kind of traveler make confident, efficient, and stress-free booking decisions. Wherever you are today, your next journey begins here.
            </p>

            <h3 className="text-lg font-bold text-brand-navy mb-3">How it works</h3>
            <p className="text-gray-600 leading-relaxed mb-2">
              Getting started is quick and intuitive. Choose up to three countries — your current location, your next destination or your home country. Then simply paste a link from your preferred booking platform, airline, or travel site and click &ldquo;Browse.&rdquo;
            </p>
            <p className="text-gray-600 leading-relaxed mb-6">
              The app instantly analyzes pricing as it appears from each selected country and presents the comparison in a clean, easy-to-read view. Within seconds, you&apos;ll know which location offers the best deal, helping you decide whether to book now or later. It&apos;s smarter planning — without the spreadsheets.
            </p>

            <h3 className="text-lg font-bold text-brand-navy mb-3">Who this is for</h3>
            <ul className="space-y-3 mb-6">
              <li className="text-gray-600 leading-relaxed">
                <span className="font-semibold text-brand-navy">Business travelers:</span> Optimize travel spending while staying on schedule. Quickly determine whether to book from your current location or back home, helping you save time and company budget.
              </li>
              <li className="text-gray-600 leading-relaxed">
                <span className="font-semibold text-brand-navy">Digital nomads:</span> Seamlessly compare prices across countries as you move from place to place, so your bookings stay as flexible as your lifestyle.
              </li>
              <li className="text-gray-600 leading-relaxed">
                <span className="font-semibold text-brand-navy">Families and leisure travelers:</span> Take the stress out of planning by clearly seeing where you&apos;ll get the best value before you book your next trip together.
              </li>
              <li className="text-gray-600 leading-relaxed">
                <span className="font-semibold text-brand-navy">Anyone who travels often:</span> If you love exploring the world, this app becomes your smart companion — helping you make better booking decisions every time you travel.
              </li>
            </ul>

            <h3 className="text-lg font-bold text-brand-navy mb-3">Now it&apos;s your move.</h3>
            <p className="text-gray-600 leading-relaxed mb-6">
              Whether you&apos;re still on the road or already back home, don&apos;t leave your next trip to chance. Try it today, compare in seconds, and book with confidence — smarter travel decisions are just one click away.
            </p>

            <button
              onClick={() => setShowHowItWorks(false)}
              className="w-full bg-brand-navy hover:bg-brand-navy-light text-white font-semibold py-3 px-6 rounded-xl text-base"
            >
              Browse Now
            </button>
          </div>
        </div>
      )}
    </div>
  );
}
