<?php
namespace Modules\GestorContratos\Controllers;

use Gestoreasy\Core\Http\Request;
use Gestoreasy\Core\Http\Response;
use Gestoreasy\Core\Tenant\TenantContext;
use Modules\GestorContratos\Services\AssinaturaService;
use Modules\GestorContratos\Services\ContratoService;

class AssinaturaController {
    private function getTenantId(): string {
        return TenantContext::getTenantId();
    }

    /**
     * Assina um contrato (endpoint público)
     */
    public function assinar(Request $req): Response {
        try {
            $tenantId = $req->query['tenant'] ?? $this->getTenantId();
            $assinuaturaService = new AssinaturaService($tenantId);

            $signatarioId = (int)($req->get('params')[0] ?? 0);
            $token = $req->query['token'] ?? '';

            if (!$signatarioId || !$token) {
                return new Response(422, ['error' => ['code' => 'invalid_data', 'message' => 'Token e ID do signatário são obrigatórios']]);
            }

            $body = is_array($req->body) ? $req->body : [];

            $assinuaturaService->assinarContrato($signatarioId, $token, $body);

            return Response::json(['message' => 'Contrato assinado com sucesso']);
        } catch (\Exception $e) {
            return new Response(500, ['error' => ['code' => 'error', 'message' => $e->getMessage()]]);
        }
    }

    /**
     * Visualiza contrato para assinatura (endpoint público)
     */
    public function visualizar(Request $req): Response {
        try {
            $tenantId = $req->query['tenant'] ?? $this->getTenantId();
            $assinuaturaService = new AssinaturaService($tenantId);
            $contratoService = new ContratoService($tenantId);

            $signatarioId = (int)($req->get('params')[0] ?? 0);
            $token = $req->query['token'] ?? '';

            if (!$signatarioId || !$token) {
                return new Response(422, ['error' => ['code' => 'invalid_data', 'message' => 'Token e ID do signatário são obrigatórios']]);
            }

            // Validar token
            $signatario = $assinuaturaService->validarTokenAssinatura($signatarioId, $token);
            if (!$signatario) {
                return new Response(401, ['error' => ['code' => 'invalid_token', 'message' => 'Token inválido ou expirado']]);
            }

            // Buscar contrato
            $contrato = $contratoService->buscarContrato($signatario['contrato_id']);

            if (!$contrato) {
                return new Response(404, ['error' => ['code' => 'not_found', 'message' => 'Contrato não encontrado']]);
            }

            return Response::json([
                'data' => [
                    'contrato' => $contrato,
                    'signatario' => $signatario
                ]
            ]);
        } catch (\Exception $e) {
            return new Response(500, ['error' => ['code' => 'error', 'message' => $e->getMessage()]]);
        }
    }

    /**
     * Gera link de assinatura
     */
    public function gerarLink(Request $req): Response {
        try {
            $tenantId = $this->getTenantId();
            $assinuaturaService = new AssinaturaService($tenantId);

            $signatarioId = (int)($req->get('params')[0] ?? 0);
            if (!$signatarioId) {
                return new Response(422, ['error' => ['code' => 'invalid_id', 'message' => 'ID do signatário inválido']]);
            }

            $link = $assinuaturaService->gerarLinkAssinatura($signatarioId);

            return Response::json(['data' => ['link' => $link]]);
        } catch (\Exception $e) {
            return new Response(500, ['error' => ['code' => 'error', 'message' => $e->getMessage()]]);
        }
    }
}

