import * as cheerio from "cheerio";
import { Property } from "../types/property";
import { BaseScraper } from "./baseScraper";

/**
 * Scraper para Inmobiliaria.es (directorio de inmuebles)
 * URL: https://www.inmobiliaria.es/comprar/lliria
 */
export class InmobiliariaScraper extends BaseScraper {
    constructor() { super("https://www.inmobiliaria.es", "Inmobiliaria.es"); }

    async scrape(): Promise<Property[]> {
        const zones = await this.getActiveZones();
        const targets = zones.length > 0
            ? zones.map(z => `${this.baseUrl}/comprar/${z.slug}`)
            : [`${this.baseUrl}/comprar/lliria`];

        const properties: Property[] = [];
        const seenUrls = new Set<string>();
        let consecutiveFailed = 0;

        for (const url of targets) {
            const html = await this.fetchHtml(url);
            if (!html) {
                consecutiveFailed++;
                // Si 2 URLs consecutivas fallan → servidor caído o bloqueando, abortar
                if (consecutiveFailed >= 2) {
                    console.error(`[Inmobiliaria.es] Servidor inaccesible (${consecutiveFailed} fallos consecutivos), abortando scraping`);
                    break;
                }
                continue;
            }
            consecutiveFailed = 0;
            const $ = cheerio.load(html);
            $("article, .property-item, [class*='card'], [class*='property']").each((_i, el) => {
                try {
                    const title = this.sanitizeText($(el).find("h2, h3, [class*='title']").first().text() || "Propiedad");
                    const priceRaw = $(el).find("[class*='price'], .price").first().text();
                    const price = this.parsePrice(priceRaw);
                    const href = $(el).find("a").attr("href") || "";
                    const url2 = href.startsWith("http") ? href : `${this.baseUrl}${href}`;
                    const location = this.sanitizeText($(el).find("[class*='location'], .ubicacion").first().text());
                    const image_url = $(el).find("img").attr("src") || "";
                    if (price > 0 && href && !seenUrls.has(url2)) {
                        seenUrls.add(url2);
                        properties.push({
                            title, price, location,
                            municipality: this.detectMunicipality(location, zones),
                            property_type: this.normalizeType(title),
                            url: url2, source: this.sourceName, image_url,
                        });
                    }
                } catch { /* skip */ }
            });
        }
        return this.validateResults(properties);
    }
}
