<?php

namespace Acms\Services\Form;

use Symfony\Component\Yaml\Yaml;

/**
 * フォームのエクスポート処理。エントリー/ブログ/モジュールのエクスポートと同様に専用クラスとして用意する。
 *
 * 永続化・変換は {@see RepositoryInterface} に閉じる。インポートは {@see Import} に分離している。
 * エクスポートは再インポート可能な原本（生レコード）を出力するため、Repository::findRawById を用いる。
 * 認可（form_view / form_edit ロール等）と CSRF はハンドラ側の責務とする。
 */
class Export
{
    /**
     * @var RepositoryInterface
     */
    private $repository;

    /**
     * @param RepositoryInterface|null $repository
     */
    public function __construct(?RepositoryInterface $repository = null)
    {
        $this->repository = $repository ?? new Repository();
    }

    /**
     * フォーム1件をエクスポート用の配列に変換する
     *
     * フォームは form テーブル単一行で完結し外部エンティティ参照を持たないため、
     * 生レコードをそのまま 'form' 配下に格納する（モジュールのような meta ID 変換は不要）。
     *
     * @param int $formId
     * @return array<string, mixed>
     */
    public function toArray($formId)
    {
        $row = $this->repository->findRawById($formId);
        if ($row === null) {
            return [];
        }

        return ['form' => [$row]];
    }

    /**
     * フォーム1件を YAML 文字列としてエクスポートする
     *
     * @param int $formId
     * @return string
     */
    public function toYaml($formId)
    {
        return Yaml::dump($this->toArray($formId), 2, 4);
    }
}
