<?php
namespace Modules\GestorY\Services;

use Gestoreasy\Core\Tenant\ConnectionManager;
use Gestoreasy\Core\Tenant\TenantContext;
use Modules\GestorY\Services\YamahaScraperService;
use Modules\GestorY\Services\NotificationService;
use PDO;
use Exception;

/**
 * Serviço para agendamento e execução de atualizações automáticas
 */
class UpdateSchedulerService {
    private PDO $pdo;
    private string $tenantId;

    public function __construct() {
        $this->pdo = ConnectionManager::forTenant();
        $this->tenantId = TenantContext::getTenantId();
    }

    /**
     * Verifica se é necessário executar atualização
     */
    public function precisaAtualizar(): bool {
        $stmt = $this->pdo->prepare('SELECT atualizacao_automatica, frequencia_atualizacao, ultima_atualizacao 
            FROM gestory_config WHERE tenant_id = ? LIMIT 1');
        $stmt->execute([$this->tenantId]);
        $config = $stmt->fetch();
        
        if (!$config || !$config['atualizacao_automatica']) {
            return false;
        }
        
        if (empty($config['ultima_atualizacao'])) {
            return true; // Nunca atualizou
        }
        
        $ultima = strtotime($config['ultima_atualizacao']);
        $frequencia = (int)($config['frequencia_atualizacao'] ?? 24) * 3600; // Converter horas para segundos
        $proxima = $ultima + $frequencia;
        
        return time() >= $proxima;
    }

    /**
     * Executa atualização automática
     */
    public function executarAtualizacao(): array {
        $resultado = [
            'sucesso' => 0,
            'erros' => 0,
            'atualizadas' => 0,
            'novas' => 0,
            'mensagens' => []
        ];

        try {
            // Buscar configuração
            $stmt = $this->pdo->prepare('SELECT modelos_importar, limite_requisicoes FROM gestory_config WHERE tenant_id = ? LIMIT 1');
            $stmt->execute([$this->tenantId]);
            $config = $stmt->fetch();
            
            $modelos = [];
            if (!empty($config['modelos_importar'])) {
                $modelos = json_decode($config['modelos_importar'], true) ?: [];
            }
            
            if (empty($modelos)) {
                $resultado['mensagens'][] = 'Nenhum modelo configurado para atualização';
                return $resultado;
            }

            $scraper = new YamahaScraperService();
            $notif = new NotificationService();
            $limite = (int)($config['limite_requisicoes'] ?? 100);
            $requisicoes = 0;

            foreach ($modelos as $modelo) {
                if ($requisicoes >= $limite) {
                    $resultado['mensagens'][] = "Limite de requisições atingido ($limite)";
                    $notif->notificarLimiteRequisicoes();
                    break;
                }

                try {
                    // Pesquisar peças do modelo
                    $pecas = $scraper->pesquisarPecas($modelo, $modelo);
                    $requisicoes++;

                    foreach ($pecas as $peca) {
                        try {
                            // Verificar se já existe
                            $stmt = $this->pdo->prepare('SELECT id FROM gestory_pecas 
                                WHERE tenant_id = ? AND codigo_yamaha = ? LIMIT 1');
                            $stmt->execute([$this->tenantId, $peca['codigo_yamaha']]);
                            $existente = $stmt->fetch();

                            if ($existente) {
                                // Atualizar
                                $peca['modelo_compativel'] = [$modelo];
                                $scraper->salvarPeca($peca);
                                $resultado['atualizadas']++;
                            } else {
                                // Nova peça
                                $peca['modelo_compativel'] = [$modelo];
                                $scraper->salvarPeca($peca);
                                $resultado['novas']++;
                            }
                            $resultado['sucesso']++;
                        } catch (Exception $e) {
                            $resultado['erros']++;
                            $resultado['mensagens'][] = "Erro ao salvar peça {$peca['codigo_yamaha']}: " . $e->getMessage();
                        }
                    }
                } catch (Exception $e) {
                    $resultado['erros']++;
                    $resultado['mensagens'][] = "Erro ao pesquisar modelo $modelo: " . $e->getMessage();
                }

                // Pequeno delay entre requisições
                usleep(500000); // 0.5 segundos
            }

            // Atualizar timestamp
            $stmt = $this->pdo->prepare('UPDATE gestory_config SET ultima_atualizacao = NOW() WHERE tenant_id = ?');
            $stmt->execute([$this->tenantId]);

            // Log
            $this->log('atualizacao', 'Atualização automática executada', [
                'sucesso' => $resultado['sucesso'],
                'erros' => $resultado['erros'],
                'atualizadas' => $resultado['atualizadas'],
                'novas' => $resultado['novas']
            ], $resultado['erros'] === 0);

        } catch (Exception $e) {
            $resultado['mensagens'][] = "Erro geral: " . $e->getMessage();
            $this->log('erro', 'Erro na atualização automática', ['erro' => $e->getMessage()], false);
        }

        return $resultado;
    }

    /**
     * Agenda próxima atualização (para uso com cron)
     */
    public function agendarProximaAtualizacao(): void {
        // Este método pode ser chamado por um cron job
        if ($this->precisaAtualizar()) {
            $this->executarAtualizacao();
        }
    }

    private function log(string $tipo, string $acao, array $dados = [], bool $sucesso = true): void {
        try {
            $stmt = $this->pdo->prepare('INSERT INTO gestory_logs 
                (tenant_id, tipo, acao, mensagem, dados_json, sucesso)
                VALUES (?, ?, ?, ?, ?, ?)');
            
            $stmt->execute([
                $this->tenantId,
                $tipo,
                $acao,
                $dados['mensagem'] ?? $acao,
                json_encode($dados),
                $sucesso ? 1 : 0
            ]);
        } catch (Exception $e) {
            error_log("[GestorY] Erro ao salvar log: " . $e->getMessage());
        }
    }
}

