<?php

namespace App\Services\Keywords;

class CatalogKeywordSeedResolver
{
    public function __construct(
        private KeywordSeedBuilder $heuristicBuilder,
        private AiKeywordSeedBuilder $aiBuilder,
        private ProductKeywordParser $keywordParser,
    ) {}

    /**
     * @param  list<array<string, mixed>>  $candidates
     * @return array{
     *     seeds: list<string>,
     *     user_seeds: list<string>,
     *     ai_seeds: list<string>,
     *     heuristic_seeds: list<string>,
     *     product_seeds: list<array{user: list<string>, ai: list<string>, heuristic: list<string>}>,
     * }
     */
    public function resolve(
        string $brandName,
        string $category,
        string $subcategory,
        array $candidates,
    ): array {
        $limit = max(1, (int) config('google-ads.max_seeds', 15));
        $userSeeds = $this->keywordParser->seedsFromCandidates($candidates);
        $aiResult = $this->aiBuilder->build($brandName, $category, $subcategory, $candidates);
        $aiSeeds = $aiResult['seeds'];
        $heuristicSeeds = $this->heuristicBuilder->build($brandName, $category, $subcategory, $candidates);
        $productSeeds = $this->productSeedBreakdowns(
            $brandName,
            $category,
            $subcategory,
            $candidates,
            $aiResult['by_product'],
        );

        $merged = [];

        foreach ([...$userSeeds, ...$aiSeeds, ...$heuristicSeeds] as $seed) {
            if (count($merged) >= $limit) {
                break;
            }

            if ($seed === '' || in_array($seed, $merged, true)) {
                continue;
            }

            $merged[] = $seed;
        }

        return [
            'seeds' => $merged,
            'user_seeds' => $userSeeds,
            'ai_seeds' => $aiSeeds,
            'heuristic_seeds' => $heuristicSeeds,
            'product_seeds' => $productSeeds,
        ];
    }

    /**
     * @param  list<array<string, mixed>>  $candidates
     * @param  list<list<string>>  $aiSeedsByProduct
     * @return list<array{user: list<string>, ai: list<string>, heuristic: list<string>}>
     */
    private function productSeedBreakdowns(
        string $brandName,
        string $category,
        string $subcategory,
        array $candidates,
        array $aiSeedsByProduct,
    ): array {
        $breakdowns = [];

        foreach ($candidates as $index => $candidate) {
            if (! is_array($candidate)) {
                $breakdowns[] = [
                    'user' => [],
                    'ai' => [],
                    'heuristic' => [],
                ];

                continue;
            }

            $breakdowns[] = [
                'user' => $this->keywordParser->seedsFromCandidate($candidate),
                'ai' => $aiSeedsByProduct[$index] ?? [],
                'heuristic' => $this->heuristicBuilder->seedsForCandidate(
                    $brandName,
                    $category,
                    $subcategory,
                    $candidate,
                ),
            ];
        }

        return $breakdowns;
    }
}
