<?php

namespace Dalten\RuianToUir\Formatter;

use Dalten\RuianToUir\Converter\Field\GeometryFieldInterface;
use Dalten\RuianToUir\Converter\Result\RemoveRecord;
use Dalten\RuianToUir\Converter\Result\ResultInterface;
use Dalten\RuianToUir\ItemType;

/**
 * Formatter, který převádí hodnoty do formátu SQL pro mysql.
 *
 * Escapování je řešeno dost humpolácky, takže pozor. :)
 */
readonly class Sql implements FormatterInterface
{
    public function __construct()
    {
    }

    /**
     * Zformátuje data na jeden sql dotaz.
     *
     * @param ResultInterface $data pole převedených dat
     *
     * @return string výsledný dotaz
     */
    public function format(ResultInterface $data): string
    {
        $converterName = $data->getItemType();
        $type = ItemType::fromConverterName($converterName);
        if ($data instanceof RemoveRecord) {
            $identName = $type->primaryKey();
            $tableName = $type->tableName();

            return \sprintf(
                'UPDATE `%s` SET `stav` = 0 WHERE `%s` = %d LIMIT 1;', $tableName, $identName, $data->getIdentifier()
            );
        }
        $fieldNames = $values = [];
        foreach ($data->getData() as $column => $value) {
            $fieldNames[] = "`$column`";
            if ($value instanceof GeometryFieldInterface) {
                $values[] = 'ST_GeomFromText(\''.$value->getWKT().'\')';
            } else {
                $values[] = "'".addslashes((string) $value)."'";
            }
        }

        return \sprintf(
            'REPLACE INTO `%s` (%s) VALUES (%s);', $type->tableName(),
            implode(', ', $fieldNames), implode(', ', $values)
        );
    }
}
