<?php

namespace App\Support;

use App\Exceptions\VideoDialogueException;

class VideoDialogue
{
    public static function wordBudget(int $duration): int
    {
        $extendCount = config('creative.vertex_extend_durations', [])[$duration] ?? null;

        if ($extendCount !== null) {
            return self::clipWordBudget(8) + ((int) $extendCount * self::clipWordBudget(7));
        }

        return self::clipWordBudget($duration);
    }

    private static function clipWordBudget(int $duration): int
    {
        return max(6, (int) floor(max(1, $duration - 1) * (float) config('creative.spoken_words_per_second', 2.2)));
    }

    public static function wordCount(string $dialogue): int
    {
        return count(preg_split('/\s+/', trim($dialogue), flags: PREG_SPLIT_NO_EMPTY) ?: []);
    }

    public static function assertFits(string $dialogue, int $duration): void
    {
        if (trim($dialogue) === '') {
            throw new VideoDialogueException('Video dialogue is empty. Please generate a new script.');
        }

        if (self::wordCount($dialogue) > self::wordBudget($duration)) {
            throw new VideoDialogueException('Video dialogue is too long for the selected duration. Please generate a shorter script.');
        }
    }
}
