<?php

/**
 * Copyright (c) 2026 PrestaShop SA
 *
 * This file is part of the PrestaShop AskAI solution.
 * For license terms, see LICENSE.md in this module.
 */

declare(strict_types=1);

namespace PrestaShop\Module\PsAskAi\Service;

use PrestaShop\Module\PsAskAi\Entity\PsAskAiConversation;
use PrestaShop\Module\PsAskAi\Repository\PsAskAiConversationRepository;

class ConversationService
{
    public function __construct(private readonly PsAskAiConversationRepository $repository)
    {
    }

    public function create(int $idEmployee, int $idShop, ?string $title = null): PsAskAiConversation
    {
        $conversation = new PsAskAiConversation(
            threadId: $this->generateThreadId(),
            idEmployee: $idEmployee,
            idShop: $idShop,
            title: $title
        );

        $this->repository->save($conversation);

        return $conversation;
    }

    public function getByThreadId(string $threadId): ?PsAskAiConversation
    {
        return $this->repository->findOneByThreadId($threadId);
    }

    /**
     * @return PsAskAiConversation[]
     */
    public function listForEmployee(int $idEmployee, int $idShop): array
    {
        return $this->repository->findActiveByEmployee($idEmployee, $idShop);
    }

    public function touch(PsAskAiConversation $conversation): void
    {
        $conversation->touch();
        $this->repository->save($conversation);
    }

    public function archive(PsAskAiConversation $conversation): void
    {
        $conversation->archive();
        $this->repository->save($conversation);
    }

    public function setTitle(PsAskAiConversation $conversation, string $title): void
    {
        $conversation->setTitle($title);
        $this->repository->save($conversation);
    }

    private function generateThreadId(): string
    {
        return bin2hex(random_bytes(16));
    }
}
