<?php

namespace Modules\Integracoes\MercadoLivre\Controllers;

use Gestoreasy\Core\Http\Request;
use Gestoreasy\Core\Http\Response;
use Modules\Integracoes\MercadoLivre\Services\MercadoLivreAPIService;

class MercadoLivreController {
    public function getConfig(Request $req): Response {
        try {
            $tenantId = \Gestoreasy\Core\Tenant\TenantContext::getTenantId();
            $service = new MercadoLivreAPIService($tenantId);
            $config = $service->getConfig();

            // Não retornar tokens sensíveis
            unset($config['access_token'], $config['refresh_token'], $config['client_secret']);

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

    public function updateConfig(Request $req): Response {
        try {
            $tenantId = \Gestoreasy\Core\Tenant\TenantContext::getTenantId();
            $body = is_array($req->body) ? $req->body : [];

            $service = new MercadoLivreAPIService($tenantId);
            $service->updateConfig($body);

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

    public function oauthCallback(Request $req): Response {
        try {
            $code = $req->query['code'] ?? null;
            if (!$code) {
                return new Response(400, ['error' => ['code' => 'missing_code', 'message' => 'Código de autorização não fornecido']]);
            }

            $tenantId = \Gestoreasy\Core\Tenant\TenantContext::getTenantId();
            $service = new MercadoLivreAPIService($tenantId);
            $result = $service->handleOAuthCallback($code);

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

    public function listProdutos(Request $req): Response {
        try {
            $tenantId = \Gestoreasy\Core\Tenant\TenantContext::getTenantId();
            $pdo = \Gestoreasy\Core\Tenant\ConnectionManager::forTenant();
            
            $stmt = $pdo->prepare('
                SELECT mp.*, p.codigo, p.nome, p.preco, p.estoque
                FROM mercadolivre_produtos mp
                INNER JOIN products p ON mp.product_id = p.id
                WHERE mp.tenant_id = ?
                ORDER BY mp.updated_at DESC
            ');
            $stmt->execute([$tenantId]);
            $produtos = $stmt->fetchAll(\PDO::FETCH_ASSOC);

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

    public function sincronizarProdutos(Request $req): Response {
        try {
            $tenantId = \Gestoreasy\Core\Tenant\TenantContext::getTenantId();
            $body = is_array($req->body) ? $req->body : [];
            
            $productIds = $body['product_ids'] ?? [];
            $processarEmFila = (bool)($body['processar_em_fila'] ?? true);
            
            if (empty($productIds)) {
                // Sincronizar todos os produtos publicados no ML
                $pdo = \Gestoreasy\Core\Tenant\ConnectionManager::forTenant();
                $stmt = $pdo->prepare('
                    SELECT product_id 
                    FROM mercadolivre_produtos 
                    WHERE tenant_id = ? AND status = "ativo"
                ');
                $stmt->execute([$tenantId]);
                $productIds = array_column($stmt->fetchAll(\PDO::FETCH_ASSOC), 'product_id');
            }

            $service = new MercadoLivreAPIService($tenantId);
            
            if ($processarEmFila) {
                // Processar em fila (assíncrono)
                $resultado = $service->sincronizarProdutosEmFila($productIds);
            } else {
                // Processar sincronamente
                $resultado = $service->sincronizarProdutosEmLote($productIds);
            }

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

    public function publicarProduto(Request $req): Response {
        try {
            $tenantId = \Gestoreasy\Core\Tenant\TenantContext::getTenantId();
            $productId = (int)($req->get('params')[0] ?? 0);
            $body = is_array($req->body) ? $req->body : [];

            if (!$productId) {
                return new Response(422, ['error' => ['code' => 'validation_error', 'message' => 'product_id é obrigatório']]);
            }

            $service = new MercadoLivreAPIService($tenantId);
            $resultado = $service->publicarProduto($productId, $body);

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

    public function listPedidos(Request $req): Response {
        try {
            $tenantId = \Gestoreasy\Core\Tenant\TenantContext::getTenantId();
            $pdo = \Gestoreasy\Core\Tenant\ConnectionManager::forTenant();
            
            $stmt = $pdo->prepare('
                SELECT * FROM mercadolivre_pedidos
                WHERE tenant_id = ?
                ORDER BY created_at DESC
                LIMIT 100
            ');
            $stmt->execute([$tenantId]);
            $pedidos = $stmt->fetchAll(\PDO::FETCH_ASSOC);

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

    public function sincronizarPedidos(Request $req): Response {
        try {
            $tenantId = \Gestoreasy\Core\Tenant\TenantContext::getTenantId();
            $service = new MercadoLivreAPIService($tenantId);
            $resultado = $service->sincronizarPedidos();

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

    public function importarPedido(Request $req): Response {
        try {
            $tenantId = \Gestoreasy\Core\Tenant\TenantContext::getTenantId();
            $mlOrderId = (int)($req->get('params')[0] ?? 0);

            if (!$mlOrderId) {
                return new Response(422, ['error' => ['code' => 'validation_error', 'message' => 'order_id é obrigatório']]);
            }

            $service = new MercadoLivreAPIService($tenantId);
            $result = $service->importarPedido($mlOrderId);

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

    public function sincronizarEstoque(Request $req): Response {
        try {
            $tenantId = \Gestoreasy\Core\Tenant\TenantContext::getTenantId();
            $body = is_array($req->body) ? $req->body : [];
            $productId = (int)($body['product_id'] ?? 0);

            if (!$productId) {
                return new Response(422, ['error' => ['code' => 'validation_error', 'message' => 'product_id é obrigatório']]);
            }

            $service = new MercadoLivreAPIService($tenantId);
            $service->sincronizarEstoque($productId);

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

    public function webhook(Request $req): Response {
        try {
            $tenantId = \Gestoreasy\Core\Tenant\TenantContext::getTenantId();
            $body = is_array($req->body) ? $req->body : [];

            // Validar webhook do ML
            $resource = $body['resource'] ?? null;
            $topic = $body['topic'] ?? null;

            if (!$resource || !$topic) {
                return new Response(400, ['error' => ['code' => 'invalid_webhook', 'message' => 'Webhook inválido']]);
            }

            // Processar webhook baseado no tópico
            switch ($topic) {
                case 'orders':
                    // Pedido atualizado
                    $this->processarWebhookPedido($tenantId, $resource);
                    break;
                case 'items':
                    // Item atualizado
                    $this->processarWebhookItem($tenantId, $resource);
                    break;
            }

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

    private function processarWebhookPedido(string $tenantId, string $orderId): void {
        try {
            $service = new MercadoLivreAPIService($tenantId);
            
            // Buscar pedido do ML
            $orderDetails = $service->buscarPedidoML((int)$orderId);
            
            // Atualizar pedido no sistema
            $pdo = \Gestoreasy\Core\Tenant\ConnectionManager::forTenant();
            $stmt = $pdo->prepare('
                UPDATE mercadolivre_pedidos
                SET status_ml = ?,
                    dados_json = ?,
                    updated_at = NOW()
                WHERE ml_order_id = ? AND tenant_id = ?
            ');
            $stmt->execute([
                $orderDetails['status'] ?? 'unknown',
                json_encode($orderDetails),
                $orderId,
                $tenantId
            ]);
        } catch (\Exception $e) {
            error_log("Erro ao processar webhook de pedido: " . $e->getMessage());
        }
    }

    private function processarWebhookItem(string $tenantId, string $itemId): void {
        try {
            $service = new MercadoLivreAPIService($tenantId);
            
            // Buscar item do ML
            $itemDetails = $service->buscarItemML($itemId);
            
            // Atualizar produto no sistema se necessário
            $pdo = \Gestoreasy\Core\Tenant\ConnectionManager::forTenant();
            $stmt = $pdo->prepare('
                SELECT product_id FROM mercadolivre_produtos
                WHERE ml_item_id = ? AND tenant_id = ?
            ');
            $stmt->execute([$itemId, $tenantId]);
            $produto = $stmt->fetch(\PDO::FETCH_ASSOC);
            
            if ($produto) {
                // Atualizar status do produto no ML
                $stmt = $pdo->prepare('
                    UPDATE mercadolivre_produtos
                    SET status = ?,
                        ultima_sincronizacao = NOW()
                    WHERE ml_item_id = ? AND tenant_id = ?
                ');
                $stmt->execute([
                    $itemDetails['status'] ?? 'ativo',
                    $itemId,
                    $tenantId
                ]);
            }
        } catch (\Exception $e) {
            error_log("Erro ao processar webhook de item: " . $e->getMessage());
        }
    }
}

