<?php

namespace Modules\UX\Services;

use PDO;
use Exception;

/**
 * Serviço para gerenciamento de onboarding
 */
class OnboardingService {
    private PDO $pdo;
    private string $tenantId;
    private int $userId;

    public function __construct(string $tenantId, int $userId) {
        $this->tenantId = $tenantId;
        $this->userId = $userId;
        $this->pdo = \Gestoreasy\Core\Tenant\ConnectionManager::forTenant($tenantId);
    }

    /**
     * Obtém status do onboarding
     */
    public function getStatus(): array {
        // Buscar status do usuário
        $stmt = $this->pdo->prepare('
            SELECT * FROM onboarding_status
            WHERE tenant_id = ? AND user_id = ?
        ');
        $stmt->execute([$this->tenantId, $this->userId]);
        $status = $stmt->fetch(PDO::FETCH_ASSOC);

        // Buscar passos disponíveis
        $stmt = $this->pdo->prepare('
            SELECT * FROM onboarding_passos
            WHERE tenant_id = ? AND ativo = TRUE
            ORDER BY ordem ASC
        ');
        $stmt->execute([$this->tenantId]);
        $passos = $stmt->fetchAll(PDO::FETCH_ASSOC);

        if (!$status) {
            // Criar status inicial
            $this->criarStatusInicial();
            $status = [
                'concluido' => false,
                'passo_atual' => 1,
                'passos_completados_json' => '[]'
            ];
        }

        $passosCompletados = json_decode($status['passos_completados_json'] ?? '[]', true) ?? [];

        // Marcar passos completados
        foreach ($passos as &$passo) {
            $passo['completado'] = in_array($passo['id'], $passosCompletados);
        }

        return [
            'concluido' => (bool)$status['concluido'],
            'passo_atual' => (int)$status['passo_atual'],
            'total_passos' => count($passos),
            'passos' => $passos
        ];
    }

    /**
     * Completa um passo do onboarding
     */
    public function completarPasso(int $passoId): void {
        // Verificar se passo existe
        $stmt = $this->pdo->prepare('
            SELECT * FROM onboarding_passos
            WHERE id = ? AND tenant_id = ? AND ativo = TRUE
        ');
        $stmt->execute([$passoId, $this->tenantId]);
        $passo = $stmt->fetch(PDO::FETCH_ASSOC);

        if (!$passo) {
            throw new Exception('Passo não encontrado');
        }

        // Buscar status
        $stmt = $this->pdo->prepare('
            SELECT * FROM onboarding_status
            WHERE tenant_id = ? AND user_id = ?
        ');
        $stmt->execute([$this->tenantId, $this->userId]);
        $status = $stmt->fetch(PDO::FETCH_ASSOC);

        $passosCompletados = [];
        if ($status) {
            $passosCompletados = json_decode($status['passos_completados_json'] ?? '[]', true) ?? [];
        }

        // Adicionar passo aos completados
        if (!in_array($passoId, $passosCompletados)) {
            $passosCompletados[] = $passoId;
        }

        // Buscar próximo passo
        $stmt = $this->pdo->prepare('
            SELECT id, ordem FROM onboarding_passos
            WHERE tenant_id = ? AND ativo = TRUE AND id NOT IN (' . implode(',', array_fill(0, count($passosCompletados), '?')) . ')
            ORDER BY ordem ASC
            LIMIT 1
        ');
        $params = array_merge([$this->tenantId], $passosCompletados);
        $stmt->execute($params);
        $proximoPasso = $stmt->fetch(PDO::FETCH_ASSOC);

        $passoAtual = $proximoPasso ? (int)$proximoPasso['ordem'] : (int)$passo['ordem'];
        $concluido = empty($proximoPasso);

        // Atualizar ou criar status
        if ($status) {
            $stmt = $this->pdo->prepare('
                UPDATE onboarding_status
                SET passo_atual = ?,
                    passos_completados_json = ?,
                    concluido = ?,
                    concluido_em = CASE WHEN ? THEN NOW() ELSE concluido_em END
                WHERE tenant_id = ? AND user_id = ?
            ');
            $stmt->execute([
                $passoAtual,
                json_encode($passosCompletados),
                $concluido,
                $concluido,
                $this->tenantId,
                $this->userId
            ]);
        } else {
            $stmt = $this->pdo->prepare('
                INSERT INTO onboarding_status (
                    tenant_id, user_id, passo_atual,
                    passos_completados_json, concluido, concluido_em, iniciado_em
                ) VALUES (?, ?, ?, ?, ?, ?, NOW())
            ');
            $stmt->execute([
                $this->tenantId,
                $this->userId,
                $passoAtual,
                json_encode($passosCompletados),
                $concluido,
                $concluido ? date('Y-m-d H:i:s') : null
            ]);
        }
    }

    /**
     * Pula onboarding
     */
    public function pular(): void {
        // Buscar todos os passos
        $stmt = $this->pdo->prepare('
            SELECT id FROM onboarding_passos
            WHERE tenant_id = ? AND ativo = TRUE
        ');
        $stmt->execute([$this->tenantId]);
        $todosPassos = $stmt->fetchAll(PDO::FETCH_COLUMN);

        // Marcar todos como completados
        $stmt = $this->pdo->prepare('
            INSERT INTO onboarding_status (
                tenant_id, user_id, passo_atual, passos_completados_json,
                concluido, concluido_em, iniciado_em
            ) VALUES (?, ?, 999, ?, TRUE, NOW(), NOW())
            ON DUPLICATE KEY UPDATE
                passo_atual = 999,
                passos_completados_json = VALUES(passos_completados_json),
                concluido = TRUE,
                concluido_em = NOW()
        ');
        $stmt->execute([
            $this->tenantId,
            $this->userId,
            json_encode($todosPassos)
        ]);
    }

    /**
     * Cria status inicial
     */
    private function criarStatusInicial(): void {
        $stmt = $this->pdo->prepare('
            INSERT INTO onboarding_status (
                tenant_id, user_id, passo_atual, iniciado_em
            ) VALUES (?, ?, 1, NOW())
        ');
        $stmt->execute([$this->tenantId, $this->userId]);
    }

    /**
     * Inicializa passos padrão do onboarding
     */
    public function inicializarPassosPadrao(): void {
        // Verificar se já existem passos
        $stmt = $this->pdo->prepare('SELECT COUNT(*) FROM onboarding_passos WHERE tenant_id = ?');
        $stmt->execute([$this->tenantId]);
        if ($stmt->fetchColumn() > 0) {
            return; // Já inicializado
        }

        $passos = [
            [
                'ordem' => 1,
                'titulo' => 'Bem-vindo ao GestorEasy!',
                'descricao' => 'Vamos começar configurando seu sistema',
                'tipo' => 'informacao',
                'conteudo_html' => '<p>Bem-vindo ao GestorEasy! Este guia irá ajudá-lo a configurar seu sistema.</p>',
                'acao_url' => '/settings/params',
                'acao_texto' => 'Configurar Parâmetros'
            ],
            [
                'ordem' => 2,
                'titulo' => 'Cadastre seus Primeiros Produtos',
                'descricao' => 'Adicione produtos ao seu catálogo',
                'tipo' => 'acao',
                'conteudo_html' => '<p>Comece cadastrando seus produtos principais.</p>',
                'acao_url' => '/produtos',
                'acao_texto' => 'Cadastrar Produtos'
            ],
            [
                'ordem' => 3,
                'titulo' => 'Cadastre seus Clientes',
                'descricao' => 'Adicione seus clientes ao sistema',
                'tipo' => 'acao',
                'conteudo_html' => '<p>Cadastre seus clientes para começar a vender.</p>',
                'acao_url' => '/clientes',
                'acao_texto' => 'Cadastrar Clientes'
            ],
            [
                'ordem' => 4,
                'titulo' => 'Configure Formas de Pagamento',
                'descricao' => 'Configure como você recebe pagamentos',
                'tipo' => 'configuracao',
                'conteudo_html' => '<p>Configure suas formas de pagamento preferidas.</p>',
                'acao_url' => '/financeiro/config',
                'acao_texto' => 'Configurar Pagamentos'
            ],
            [
                'ordem' => 5,
                'titulo' => 'Explore o Dashboard',
                'descricao' => 'Conheça as principais funcionalidades',
                'tipo' => 'tutorial',
                'conteudo_html' => '<p>O dashboard mostra um resumo do seu negócio.</p>',
                'acao_url' => '/dashboard',
                'acao_texto' => 'Ver Dashboard'
            ]
        ];

        foreach ($passos as $passo) {
            $stmt = $this->pdo->prepare('
                INSERT INTO onboarding_passos (
                    tenant_id, ordem, titulo, descricao, tipo,
                    conteudo_html, acao_url, acao_texto
                ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
            ');
            $stmt->execute([
                $this->tenantId,
                $passo['ordem'],
                $passo['titulo'],
                $passo['descricao'],
                $passo['tipo'],
                $passo['conteudo_html'],
                $passo['acao_url'],
                $passo['acao_texto']
            ]);
        }
    }
}

