<?php

namespace App\DTOs;

readonly class ScrapedListingResult
{
    /**
     * @param  list<ScrapedListingProduct>  $products
     * @param  list<string>|null  $enginesTried
     */
    public function __construct(
        public string $url,
        public array $products,
        public ?string $error = null,
        public ?string $source = null,
        public ?string $browserEngine = null,
        public ?array $enginesTried = null,
    ) {}

    public function succeeded(): bool
    {
        return $this->error === null;
    }

    /**
     * @param  array<string, mixed>  $payload
     */
    public static function fromPayload(string $url, array $payload, ?string $source = null): self
    {
        $error = filled($payload['error'] ?? null) ? (string) $payload['error'] : null;
        $products = [];

        foreach (is_array($payload['products'] ?? null) ? $payload['products'] : [] as $row) {
            if (! is_array($row)) {
                continue;
            }

            $product = ScrapedListingProduct::fromArray($row);

            if ($product !== null) {
                $products[] = $product;
            }
        }

        return new self(
            url: (string) ($payload['url'] ?? $url),
            products: $products,
            error: $error,
            source: $source ?? (filled($payload['source'] ?? null) ? (string) $payload['source'] : null),
            browserEngine: filled($payload['browser_engine'] ?? null) ? (string) $payload['browser_engine'] : null,
            enginesTried: is_array($payload['engines_tried'] ?? null) ? array_values($payload['engines_tried']) : null,
        );
    }
}
