<?php

declare(strict_types=1);

namespace App\Framework\Svg\ValueObjects\Text;

use App\Framework\Exception\ErrorCode;
use App\Framework\Exception\FrameworkException;

/**
 * Value Object representing text content in SVG
 * Handles escaping and validation
 */
final readonly class TextContent
{
    public function __construct(
        public string $value
    ) {
        if ($value === '') {
            throw FrameworkException::create(
                ErrorCode::VAL_INVALID_FORMAT,
                'Text content cannot be empty'
            );
        }
    }

    public static function fromString(string $text): self
    {
        return new self($text);
    }

    /**
     * Get escaped text for SVG output
     */
    public function toSvgSafeString(): string
    {
        return htmlspecialchars($this->value, ENT_XML1 | ENT_QUOTES, 'UTF-8');
    }

    /**
     * Get length of text
     */
    public function getLength(): int
    {
        return mb_strlen($this->value);
    }

    /**
     * Truncate text to maximum length
     */
    public function truncate(int $maxLength, string $suffix = '...'): self
    {
        if ($this->getLength() <= $maxLength) {
            return $this;
        }

        $truncated = mb_substr($this->value, 0, $maxLength - mb_strlen($suffix));

        return new self($truncated . $suffix);
    }

    /**
     * Check if text is empty
     */
    public function isEmpty(): bool
    {
        return trim($this->value) === '';
    }

    public function __toString(): string
    {
        return $this->value;
    }
}
