<?php

namespace Espo\Custom\Api\CPuls;

use Espo\Core\Api\Action;
use Espo\Core\Api\Request;
use Espo\Core\Api\Response;
use Espo\Core\Api\ResponseComposer;
use Espo\Core\Exceptions\BadRequest;
use Espo\Core\Exceptions\Forbidden;
use Espo\Core\Exceptions\NotFound;
use Espo\ORM\EntityManager;

class AbschliessenFuerTeam implements Action
{
    public function __construct(
        private EntityManager $entityManager
    ) {}

    public function process(Request $request): Response
    {
        $id = $request->getRouteParam('id');
        if (!$id) {
            throw new BadRequest('ID fehlt.');
        }

        $puls = $this->entityManager->getEntityById('CPuls', $id);
        if (!$puls) {
            throw new NotFound('Puls nicht gefunden.');
        }

        // Prüfe, ob bereits finalisiert
        if ($puls->get('status') === 'Finalisiert') {
            throw new Forbidden('Puls wurde bereits finalisiert.');
        }

        // Prüfe syncStatus
        if ($puls->get('syncStatus') === 'unclean') {
            throw new BadRequest('Neue Dokumente vorhanden. Bitte warten Sie auf die KI-Analyse.');
        }

        // Hole aktuelle Team-ID des Benutzers
        $user = $this->entityManager->getEntityById('User', $request->getServerParam('ESPO_USER_ID'));
        if (!$user) {
            throw new Forbidden('Benutzer nicht gefunden.');
        }

        $teamIds = $user->getLinkMultipleIdList('teams');
        if (empty($teamIds)) {
            throw new Forbidden('Sie sind keinem Team zugeordnet.');
        }

        // Finde Zuordnung für erstes Team des Benutzers
        $zuordnung = $this->entityManager->getRDBRepositoryByClass('CPulsTeamZuordnung')
            ->where([
                'pulsId' => $id,
                'teamId' => $teamIds,
                'aktiv' => true
            ])
            ->findOne();

        if (!$zuordnung) {
            throw new Forbidden('Sie sind diesem Puls nicht zugeordnet oder nicht aktiv.');
        }

        // Markiere Zuordnung als abgeschlossen
        $zuordnung->set([
            'abgeschlossen' => true,
            'abgeschlossenAm' => date('Y-m-d H:i:s'),
            'abgeschlossenVon' => $user->getId()
        ]);
        $this->entityManager->saveEntity($zuordnung);

        // FIRST-READ-CLOSES: Finalisiere den Puls sofort
        $puls->set([
            'status' => 'Finalisiert',
            'finalisiertAm' => date('Y-m-d H:i:s'),
            'finalisiertVon' => $user->getId()
        ]);
        $this->entityManager->saveEntity($puls);

        $GLOBALS['log']->info("Puls {$id} durch Team {$zuordnung->get('teamId')} finalisiert (First-Read-Closes).");

        return ResponseComposer::json([
            'success' => true,
            'finalized' => true,
            'message' => 'Puls wurde finalisiert (First-Read-Closes).'
        ]);
    }
}
