<?php
namespace Modules\GestorContratos\Controllers;

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

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

    /**
     * Lista modelos
     */
    public function list(Request $req): Response {
        try {
            $tenantId = $this->getTenantId();
            $service = new ModeloService($tenantId);

            $filtros = [
                'categoria' => $req->query['categoria'] ?? null,
                'ativo' => $req->query['ativo'] ?? null,
                'busca' => $req->query['busca'] ?? null
            ];

            $modelos = $service->listarModelos($filtros);

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

    /**
     * Busca um modelo por ID
     */
    public function get(Request $req): Response {
        try {
            $tenantId = $this->getTenantId();
            $service = new ModeloService($tenantId);

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

            $modelo = $service->buscarModelo($modeloId);
            if (!$modelo) {
                return new Response(404, ['error' => ['code' => 'not_found', 'message' => 'Modelo não encontrado']]);
            }

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

    /**
     * Cria um novo modelo
     */
    public function create(Request $req): Response {
        try {
            $tenantId = $this->getTenantId();
            $service = new ModeloService($tenantId);

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

            // Validar dados obrigatórios
            if (empty($body['nome'])) {
                return new Response(422, ['error' => ['code' => 'invalid_data', 'message' => 'Nome é obrigatório']]);
            }

            if (empty($body['conteudo_html'])) {
                return new Response(422, ['error' => ['code' => 'invalid_data', 'message' => 'Conteúdo é obrigatório']]);
            }

            $modeloId = $service->criarModelo($body);

            return new Response(201, ['data' => ['id' => $modeloId, 'message' => 'Modelo criado com sucesso']]);
        } catch (\Exception $e) {
            return new Response(500, ['error' => ['code' => 'error', 'message' => $e->getMessage()]]);
        }
    }

    /**
     * Atualiza um modelo
     */
    public function update(Request $req): Response {
        try {
            $tenantId = $this->getTenantId();
            $service = new ModeloService($tenantId);

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

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

            $service->atualizarModelo($modeloId, $body);

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

    /**
     * Duplica um modelo
     */
    public function duplicar(Request $req): Response {
        try {
            $tenantId = $this->getTenantId();
            $service = new ModeloService($tenantId);

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

            $body = is_array($req->body) ? $req->body : [];
            $novoNome = $body['nome'] ?? 'Cópia do modelo';

            $novoModeloId = $service->duplicarModelo($modeloId, $novoNome);

            return new Response(201, ['data' => ['id' => $novoModeloId, 'message' => 'Modelo duplicado com sucesso']]);
        } catch (\Exception $e) {
            return new Response(500, ['error' => ['code' => 'error', 'message' => $e->getMessage()]]);
        }
    }

    /**
     * Deleta um modelo
     */
    public function delete(Request $req): Response {
        try {
            $tenantId = $this->getTenantId();
            $service = new ModeloService($tenantId);

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

            $service->deletarModelo($modeloId);

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

    /**
     * Preenche modelo com dados
     */
    public function preencher(Request $req): Response {
        try {
            $tenantId = $this->getTenantId();
            $service = new ModeloService($tenantId);

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

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

            $conteudoPreenchido = $service->preencherModelo($modeloId, $dados);

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

