<?php

namespace Xentral\Modules\HocrParser\Finder;

use Xentral\Modules\HocrParser\Data\BoundingBox;
use Xentral\Modules\HocrParser\Data\BoundingBoxCollection;

class BoundingBoxFinder
{
    /** @var BoundingBoxCollection $boxes */
    private $boxes;

    /** @var array|RelativePositionFinderFacet[] $criteria */
    private $criteria;

    /** @var array $currencies */
    private $currencies;

    /**
     * @param BoundingBoxCollection               $boxes
     * @param array|RelativePositionFinderFacet[] $criteria
     * @param array                               $validCurrencies
     */
    public function __construct(BoundingBoxCollection $boxes, array $criteria, array $validCurrencies = [])
    {
        $this->boxes = $boxes;
        $this->criteria = $criteria;
        $this->currencies = $validCurrencies;
    }

    /**
     * @return array
     */
    public function Find()
    {
        $search = [];
        $result = [];

        // Alle Boxen finden die den jeweiligen Suchbegriff enthalten
        /** @var BoundingBox $box */
        foreach ($this->boxes->GetBoxes() as $box) {
            foreach ($this->criteria as $searchKey => $criteria) {
                $result[$searchKey] = null;

                // Alle Boxen sammeln die den Vorbedingungen entsprechen
                if ($criteria->MatchPreCondition($box->GetData('text'))) {
                    $search[$searchKey]['boxes'][] = $box;
                    $search[$searchKey]['criteria'] = $criteria;
                }
            }
        }

        // Schauen welche der Kandidaten die genauen Vorgaben erfüllt; der erste Treffer gewinnt
        foreach ($search as $searchKey => $searchInfo) {
            $criteria = $searchInfo['criteria'];
            $candidates = $searchInfo['boxes'];
            $result[$searchKey] = $criteria->Select($candidates, $this->boxes);
        }

        return $result;
    }
}