<?php

declare(strict_types=1);

namespace App\Mcp\Tool\Product;

use App\Entity\Product;
use App\Entity\ProductConstructeurLink;
use App\Mcp\Tool\McpToolHelper;
use App\Repository\ConstructeurRepository;
use App\Repository\ModelTypeRepository;
use Doctrine\ORM\EntityManagerInterface;
use Mcp\Capability\Attribute\McpTool;
use Mcp\Schema\Result\CallToolResult;
use Symfony\Bundle\SecurityBundle\Security;

#[McpTool(
    name: 'create_product',
    description: 'Create a new product. supplierPrice must be a string (e.g. "12.50"). Requires ROLE_GESTIONNAIRE.',
)]
class CreateProductTool
{
    use McpToolHelper;

    public function __construct(
        private readonly EntityManagerInterface $em,
        private readonly Security $security,
        private readonly ModelTypeRepository $modelTypes,
        private readonly ConstructeurRepository $constructeurs,
    ) {}

    /**
     * @param string[] $constructeurIds
     */
    public function __invoke(
        string $name,
        string $reference = '',
        string $supplierPrice = '',
        string $modelTypeId = '',
        array $constructeurIds = [],
    ): CallToolResult {
        $this->requireRole($this->security, 'ROLE_GESTIONNAIRE');

        $product = new Product();
        $product->setName($name);

        if ('' !== $reference) {
            $product->setReference($reference);
        }
        if ('' !== $supplierPrice) {
            $product->setSupplierPrice($supplierPrice);
        }

        if ('' !== $modelTypeId) {
            $modelType = $this->modelTypes->find($modelTypeId);
            if (!$modelType) {
                $this->mcpError('not_found', "ModelType not found: {$modelTypeId}");
            }
            $product->setTypeProduct($modelType);
        }

        foreach ($constructeurIds as $cId) {
            $c = $this->constructeurs->find($cId);
            if (!$c) {
                $this->mcpError('not_found', "Constructeur not found: {$cId}");
            }
            $link = new ProductConstructeurLink();
            $link->setProduct($product);
            $link->setConstructeur($c);
            $this->em->persist($link);
        }

        $this->em->persist($product);
        $this->em->flush();

        return $this->jsonResponse([
            'id'   => $product->getId(),
            'name' => $product->getName(),
        ]);
    }
}
