<?php
namespace EasyChat\Library\Ai;

use EasyChat\Library\QuickReplyAiAssistant;






class OutboundDraftAssistant {
    private const CHANNELS = array('sms', 'max', 'ozon', 'yandex_market');
    private const ACTIONS = array('proofread', 'improve');
    private const TONES = array('current', 'friendly', 'business', 'caring', 'concise');
    private const MAX_TEXT_LENGTH = 4000;

    private $assistant;

    public function __construct($registry) {
        $this->assistant = new QuickReplyAiAssistant($registry);
    }

    public function availability(): array {
        return $this->assistant->availability();
    }

    public function improve(array $input): array {
        $channel = strtolower(trim((string)($input['channel'] ?? '')));
        $action = strtolower(trim((string)($input['action'] ?? '')));
        $tone = strtolower(trim((string)($input['tone'] ?? '')));
        $text = $this->limit(trim((string)($input['text'] ?? '')), self::MAX_TEXT_LENGTH);

        if (!in_array($channel, self::CHANNELS, true)) {
            return array('success' => false, 'error' => 'channel_not_supported');
        }
        if (!in_array($action, self::ACTIONS, true)) {
            return array('success' => false, 'error' => 'action_not_supported');
        }
        if (!in_array($tone, self::TONES, true)) {
            $tone = 'current';
        }
        if ($text === '') {
            return array('success' => false, 'error' => 'text_required');
        }

        $task = $tone === 'concise' && $action === 'improve' ? 'shorten' : 'improve';
        $style = array(
            'friendly' => 'friendly',
            'business' => 'business',
            'caring' => 'friendly',
        )[$tone] ?? 'current';

        $instruction = $this->instruction($channel, $action, $tone);
        $result = $this->assistant->suggest(array(
            'task' => $task,
            'style' => $style,
            'title' => 'Первое сообщение',
            'text' => $text,
            'instruction' => $instruction,
            'use_knowledge' => false,
        ));

        if (empty($result['success'])) {
            return $result;
        }

        return array(
            'success' => true,
            'text' => $this->limit(trim((string)($result['text'] ?? '')), self::MAX_TEXT_LENGTH),
            'action' => $action,
            'tone' => $tone,
            'channel' => $channel,
        );
    }

    private function instruction($channel, $action, $tone): string {
        $channel_names = array(
            'sms' => 'SMS',
            'max' => 'MAX',
            'ozon' => 'Ozon',
            'yandex_market' => 'Яндекс Маркет',
        );
        $lines = array(
            'Это первое сообщение оператора клиенту в канале ' . $channel_names[$channel] . '.',
            'Сохрани все факты, числа, ссылки, имена товаров и смысл исходного текста.',
            'Не добавляй цены, сроки, наличие, обещания, приветствие или подпись, которых не было в исходном тексте.',
            'Не называй клиента по фамилии. Верни только готовый текст сообщения.',
        );

        if ($action === 'proofread') {
            $lines[] = 'Исправь только орфографию, пунктуацию, опечатки и явные грамматические ошибки. Не меняй тон и формулировки без необходимости.';
            return implode(' ', $lines);
        }

        $tone_instructions = array(
            'current' => 'Сделай текст яснее и грамотнее, сохранив текущий тон.',
            'friendly' => 'Сделай тон дружелюбным и естественным, без фамильярности.',
            'business' => 'Сделай тон деловым, спокойным и уверенным.',
            'caring' => 'Сделай тон заботливым и внимательным, без навязчивости.',
            'concise' => 'Сделай текст короче и удобнее для чтения, не потеряв важные детали.',
        );
        $lines[] = $tone_instructions[$tone] ?? $tone_instructions['current'];
        return implode(' ', $lines);
    }

    private function limit($value, $limit): string {
        if (function_exists('mb_substr')) {
            return mb_substr((string)$value, 0, (int)$limit, 'UTF-8');
        }
        return substr((string)$value, 0, (int)$limit);
    }
}
