<?php

declare(strict_types=1);

namespace App\Mcp\Tool\Machine;

use App\Mcp\Tool\McpToolHelper;
use App\Repository\MachineComponentLinkRepository;
use App\Repository\MachinePieceLinkRepository;
use App\Repository\MachineProductLinkRepository;
use Doctrine\ORM\EntityManagerInterface;
use Mcp\Capability\Attribute\McpTool;
use Mcp\Schema\Result\CallToolResult;
use Symfony\Bundle\SecurityBundle\Security;

#[McpTool(
    name: 'remove_machine_link',
    description: 'Remove a machine link by id and type (composant, piece, or product). Requires ROLE_GESTIONNAIRE.',
)]
class RemoveMachineLinkTool
{
    use McpToolHelper;

    public function __construct(
        private readonly EntityManagerInterface $em,
        private readonly Security $security,
        private readonly MachineComponentLinkRepository $componentLinks,
        private readonly MachinePieceLinkRepository $pieceLinks,
        private readonly MachineProductLinkRepository $productLinks,
    ) {}

    public function __invoke(string $linkId, string $linkType): CallToolResult
    {
        $this->requireRole($this->security, 'ROLE_GESTIONNAIRE');

        $link = match ($linkType) {
            'composant' => $this->componentLinks->find($linkId),
            'piece'     => $this->pieceLinks->find($linkId),
            'product'   => $this->productLinks->find($linkId),
            default     => $this->mcpError('Validation', "Unknown link type '{$linkType}'. Expected composant, piece, or product."),
        };

        if (null === $link) {
            $this->mcpError('NotFound', "Link {$linkId} of type {$linkType} not found.");
        }

        $this->em->remove($link);
        $this->em->flush();

        return $this->jsonResponse(['deleted' => true, 'id' => $linkId, 'type' => $linkType]);
    }
}
