import os
import hashlib
import json

try:
    from firecrawl import FirecrawlApp
    _firecrawl = FirecrawlApp(api_key=os.getenv('FIRECRAWL_API_KEY', ''))
    _HAS_FIRECRAWL = True
except Exception:
    _HAS_FIRECRAWL = False

try:
    import redis as _redis
    _r = _redis.from_url(os.getenv('REDIS_URL', 'redis://localhost:6379'))
    _HAS_REDIS = True
except Exception:
    _HAS_REDIS = False

MARKET_TTL = 72 * 3600  # 72h


def _cache_key(marque, modele, annee_min, annee_max, km_max):
    raw = f'market:{marque}:{modele}:{annee_min}:{annee_max}:{km_max}'.lower()
    return 'market:' + hashlib.md5(raw.encode()).hexdigest()


def _cache_get(key):
    if not _HAS_REDIS:
        return None
    try:
        val = _r.get(key)
        return json.loads(val) if val else None
    except Exception:
        return None


def _cache_set(key, data):
    if not _HAS_REDIS:
        return
    try:
        _r.setex(key, MARKET_TTL, json.dumps(data, ensure_ascii=False))
    except Exception:
        pass


def _build_leboncoin_url(marque, modele, annee_min, annee_max, km_max):
    base = 'https://www.leboncoin.fr/recherche?category=2'
    base += f'&brand={marque.lower()}&model={modele.lower()}'
    if annee_min:
        base += f'&regdate={annee_min}-{annee_max or ""}'
    if km_max:
        base += f'&mileage=0-{km_max}'
    return base


def _build_lacentrale_url(marque, modele, annee_min, annee_max, km_max):
    base = f'https://www.lacentrale.fr/listing?makesModelsCommercialNames={marque.upper()}:{modele.upper()}'
    if annee_min:
        base += f'&yearMin={annee_min}'
    if annee_max:
        base += f'&yearMax={annee_max}'
    if km_max:
        base += f'&mileageMax={km_max}'
    return base


def scrape_market(marque, modele, annee_min=None, annee_max=None, km_max=None):
    key = _cache_key(marque, modele, annee_min, annee_max, km_max)
    cached = _cache_get(key)
    if cached:
        print(f'[Market] Cache hit: {key[:16]}…')
        return cached

    if not _HAS_FIRECRAWL:
        return {'error': 'FIRECRAWL_API_KEY non configurée'}

    results = {}
    try:
        lbc_url = _build_leboncoin_url(marque, modele, annee_min, annee_max, km_max)
        results['leboncoin'] = _firecrawl.scrape_url(lbc_url, formats=['markdown'])
    except Exception as e:
        results['leboncoin'] = {'error': str(e)}

    try:
        lc_url = _build_lacentrale_url(marque, modele, annee_min, annee_max, km_max)
        results['lacentrale'] = _firecrawl.scrape_url(lc_url, formats=['markdown'])
    except Exception as e:
        results['lacentrale'] = {'error': str(e)}

    _cache_set(key, results)
    return results
