<?php

declare(strict_types=1);

namespace Acms\Services\Url;

use Field;
use Field_Search;

/**
 * POST された値から acmsLink() に渡す URI オブジェクト（Field）を組み立てる。
 *
 * フィールド検索（field / query）だけでなく、POST→GET リダイレクトやログイン後の
 * 遷移先組み立てにも使われる汎用の URL パラメータ変換なので、名前に用途（search）は含めない。
 * 成果物は acmsLink() の入力なので、Field ドメインではなく Url ドメインに属する。
 */
class UriObjectBuilder
{
    /**
     * URIオブジェクトの取得
     *
     * @param \Field $Post
     *
     * @return \Field
     */
    public function getUriObject(Field $Post)
    {
        $Uri = new Field();

        if (!$aryFd = $Post->getArray('arg')) {
            // argがない場合は、fieldとqueryを除いた全てのフィールドをURIオブジェクトにセットする
            $aryFd = array_diff($Post->listFields(), $Post->getArray('field'), $Post->getArray('query'));
        }
        foreach ($aryFd as $fd) {
            if ($fd === 'field' && $Post->getArray('field')) {
                // field
                $fieldSearch = Field_Search::fromPost($Post);
                $Uri->addChild('field', $fieldSearch);
            } elseif ($fd === 'query' && $aryQuery = $Post->getArray('query')) {
                // query
                $Query  = new Field();
                foreach ($aryQuery as $query) {
                    $Query->set($query, $Post->getArray($query));
                }
                $Uri->addChild('query', $Query);
            } else {
                // その他のフィールド
                $Uri->set($fd, $Post->getArray($fd));
            }
        }
        return $Uri;
    }
}
