<?php
namespace Modules\Marketplace\Controllers;

use Gestoreasy\Core\Http\Request;
use Gestoreasy\Core\Http\Response;
use Gestoreasy\Core\Tenant\ConnectionManager;
use Gestoreasy\Core\Admin\ConnectionManager as AdminDb;
use Gestoreasy\Core\Tenant\TenantContext;
use Gestoreasy\Core\Audit\AuditLogger;

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

    /**
     * Lista todos os módulos disponíveis no marketplace
     */
    public function listModules(Request $req): Response {
        $tenantId = $this->getTenantId();
        
        // Módulos disponíveis no marketplace
        $modules = [
            [
                'code' => 'gestor-y',
                'name' => 'Gestor-Y',
                'description' => 'Catálogo de peças Yamaha integrado com web scraping',
                'version' => '1.0.0',
                'price' => 199.90,
                'price_cycle' => 'mensal',
                'is_paid' => true,
                'status' => 'available',
                'icon' => '🏍️',
                'category' => 'Integração',
                'features' => ['Pesquisa de peças Yamaha', 'Importação automática', 'Atualização periódica', 'Integração com produtos']
            ],
            [
                'code' => 'woocommerce',
                'name' => 'Integração WooCommerce',
                'description' => 'Sincronize produtos, estoque e pedidos com sua loja WooCommerce',
                'version' => '1.0.0',
                'price' => 149.90,
                'price_cycle' => 'mensal',
                'is_paid' => true,
                'status' => 'available',
                'icon' => '🛒',
                'category' => 'Integração',
                'features' => ['Sincronização bidirecional', 'Gestão de estoque', 'Pedidos automáticos']
            ],
            [
                'code' => 'api-rest',
                'name' => 'Conexão via API REST',
                'description' => 'API completa para integração com outros sistemas',
                'version' => '1.0.0',
                'price' => 0,
                'price_cycle' => null,
                'is_paid' => false,
                'status' => 'available',
                'icon' => '🔌',
                'category' => 'Integração',
                'features' => ['Documentação completa', 'Autenticação JWT', 'Rate limiting', 'Webhooks']
            ],
            [
                'code' => 'tiktok-seller',
                'name' => 'TikTok Seller',
                'description' => 'Integração com TikTok Shop para vendas diretas',
                'version' => '1.0.0',
                'price' => 179.90,
                'price_cycle' => 'mensal',
                'is_paid' => true,
                'status' => 'available',
                'icon' => '🎵',
                'category' => 'Marketplace',
                'features' => ['Sincronização de produtos', 'Gestão de pedidos', 'Relatórios de vendas']
            ],
            [
                'code' => 'mercado-livre',
                'name' => 'Mercado Livre',
                'description' => 'Integração completa com Mercado Livre',
                'version' => '1.0.0',
                'price' => 199.90,
                'price_cycle' => 'mensal',
                'is_paid' => true,
                'status' => 'available',
                'icon' => '🛍️',
                'category' => 'Marketplace',
                'features' => ['Publicação de produtos', 'Gestão de anúncios', 'Pedidos automáticos', 'Relatórios']
            ],
            [
                'code' => 'mercado-pago',
                'name' => 'Mercado Pago',
                'description' => 'Gateway de pagamento Mercado Pago integrado',
                'version' => '1.0.0',
                'price' => 0,
                'price_cycle' => null,
                'is_paid' => false,
                'status' => 'available',
                'icon' => '💳',
                'category' => 'Pagamento',
                'features' => ['Checkout transparente', 'Pix automático', 'Boleto bancário', 'Cartão de crédito']
            ],
            [
                'code' => 'cashback',
                'name' => 'Cashback',
                'description' => 'Sistema de cashback e fidelidade para clientes',
                'version' => '1.0.0',
                'price' => 0,
                'price_cycle' => null,
                'is_paid' => false,
                'status' => 'available',
                'icon' => '💰',
                'category' => 'Marketing',
                'features' => ['Programa de fidelidade', 'Pontos e recompensas', 'Relatórios de cashback']
            ],
            [
                'code' => 'pcp',
                'name' => 'PCP - Planejamento e Controle de Produção',
                'description' => 'Módulo completo para planejamento e controle de produção',
                'version' => '1.0.0',
                'price' => 299.90,
                'price_cycle' => 'mensal',
                'is_paid' => true,
                'status' => 'available',
                'icon' => '🏭',
                'category' => 'Produção',
                'features' => ['Planejamento de produção', 'Controle de capacidade', 'Ordens de produção', 'MRP']
            ]
        ];

        // Verificar quais módulos estão instalados para este tenant
        try {
            $pdo = AdminDb::db();
            $stmt = $pdo->prepare('SELECT module, enabled FROM tenant_modules WHERE tenant_id = ?');
            $stmt->execute([$tenantId]);
            $installedModules = [];
            foreach ($stmt->fetchAll() as $row) {
                $installedModules[$row['module']] = (bool)$row['enabled'];
            }

            // Adicionar status de instalação aos módulos
            foreach ($modules as &$module) {
                $module['installed'] = isset($installedModules[$module['code']]);
                $module['enabled'] = $installedModules[$module['code']] ?? false;
            }
        } catch (\Throwable $e) {
            error_log("[Marketplace] Erro ao verificar módulos instalados: " . $e->getMessage());
        }

        return Response::json(['data' => $modules]);
    }

    /**
     * Instala um módulo para o tenant
     */
    public function installModule(Request $req): Response {
        $tenantId = $this->getTenantId();
        $code = $req->get('params')[0] ?? null;
        
        if (!$code) {
            return new Response(422, ['error' => ['code' => 'invalid_module', 'message' => 'Código do módulo inválido']]);
        }

        try {
            $pdo = AdminDb::db();
            
            // Verificar se módulo já está instalado
            $stmt = $pdo->prepare('SELECT id FROM tenant_modules WHERE tenant_id = ? AND module = ?');
            $stmt->execute([$tenantId, $code]);
            if ($stmt->fetch()) {
                return new Response(400, ['error' => ['code' => 'already_installed', 'message' => 'Módulo já está instalado']]);
            }

            // Instalar módulo
            $stmt = $pdo->prepare('INSERT INTO tenant_modules (tenant_id, module, enabled) VALUES (?, ?, ?)');
            $stmt->execute([$tenantId, $code, 1]);

            AuditLogger::log('create', 'tenant_modules', $pdo->lastInsertId(), [
                'tenant_id' => $tenantId,
                'module' => $code,
                'action' => 'install'
            ]);

            return Response::json(['message' => 'Módulo instalado com sucesso']);
        } catch (\Throwable $e) {
            error_log("[Marketplace] Erro ao instalar módulo: " . $e->getMessage());
            return new Response(500, ['error' => ['code' => 'installation_failed', 'message' => 'Erro ao instalar módulo']]);
        }
    }

    /**
     * Desinstala um módulo do tenant
     */
    public function uninstallModule(Request $req): Response {
        $tenantId = $this->getTenantId();
        $code = $req->get('params')[0] ?? null;
        
        if (!$code) {
            return new Response(422, ['error' => ['code' => 'invalid_module', 'message' => 'Código do módulo inválido']]);
        }

        try {
            $pdo = AdminDb::db();
            
            // Verificar se módulo está instalado
            $stmt = $pdo->prepare('SELECT id FROM tenant_modules WHERE tenant_id = ? AND module = ?');
            $stmt->execute([$tenantId, $code]);
            $module = $stmt->fetch();
            
            if (!$module) {
                return new Response(404, ['error' => ['code' => 'not_installed', 'message' => 'Módulo não está instalado']]);
            }

            // Desinstalar módulo
            $stmt = $pdo->prepare('DELETE FROM tenant_modules WHERE tenant_id = ? AND module = ?');
            $stmt->execute([$tenantId, $code]);

            AuditLogger::log('delete', 'tenant_modules', $module['id'], [
                'tenant_id' => $tenantId,
                'module' => $code,
                'action' => 'uninstall'
            ]);

            return Response::json(['message' => 'Módulo desinstalado com sucesso']);
        } catch (\Throwable $e) {
            error_log("[Marketplace] Erro ao desinstalar módulo: " . $e->getMessage());
            return new Response(500, ['error' => ['code' => 'uninstallation_failed', 'message' => 'Erro ao desinstalar módulo']]);
        }
    }

    /**
     * Obtém o status de um módulo
     */
    public function getModuleStatus(Request $req): Response {
        $tenantId = $this->getTenantId();
        $code = $req->get('params')[0] ?? null;
        
        if (!$code) {
            return new Response(422, ['error' => ['code' => 'invalid_module', 'message' => 'Código do módulo inválido']]);
        }

        try {
            $pdo = AdminDb::db();
            $stmt = $pdo->prepare('SELECT module, enabled FROM tenant_modules WHERE tenant_id = ? AND module = ?');
            $stmt->execute([$tenantId, $code]);
            $module = $stmt->fetch();

            if (!$module) {
                return Response::json(['installed' => false, 'enabled' => false]);
            }

            return Response::json([
                'installed' => true,
                'enabled' => (bool)$module['enabled']
            ]);
        } catch (\Throwable $e) {
            error_log("[Marketplace] Erro ao verificar status: " . $e->getMessage());
            return new Response(500, ['error' => ['code' => 'status_check_failed', 'message' => 'Erro ao verificar status']]);
        }
    }
}

