<?php
// public/api/funis.php
require_once __DIR__ . '/../../app/config.php';
require_once __DIR__ . '/../../app/db.php';
require_once __DIR__ . '/../../app/helpers.php';

header('Content-Type: application/json; charset=utf-8');

function jexit(array $payload, int $status = 200) {
  http_response_code($status);
  echo json_encode($payload);
  exit;
}

if (empty($_SESSION['user']['id']) || empty($_SESSION['user']['email'])) {
  jexit(['ok' => false, 'error' => 'Não autenticado'], 401);
}

$pdo = db();

function getOrCreateUsersId(PDO $pdo, string $sessionId, string $email, ?string $name = null): string {
  $q = $pdo->prepare('SELECT id FROM users WHERE email = :e LIMIT 1');
  $q->execute([':e' => $email]);
  $id = $q->fetchColumn();
  if ($id) return $id;

  $ins = $pdo->prepare('
    INSERT INTO users (id, email, name)
    VALUES (:id, :e, :n)
    ON CONFLICT (email) DO NOTHING
  ');
  $ins->execute([':id' => $sessionId, ':e' => $email, ':n' => $name]);

  $q->execute([':e' => $email]);
  $id = $q->fetchColumn();
  if (!$id) throw new RuntimeException('Falha ao sincronizar usuário em `users`.');
  return $id;
}

$authId    = $_SESSION['user']['id'];
$authEmail = $_SESSION['user']['email'];
$authName  = $_SESSION['user']['name'] ?? null;
$userId    = getOrCreateUsersId($pdo, $authId, $authEmail, $authName);

$action = $_GET['action'] ?? 'list';

function validate_sequence($seq) {
  if (!is_array($seq)) return 'Sequência deve ser um array.';

  // 1) incluir 'video' aqui
  $allowed = ['texto','audio','imagem','pdf','video','esperar','fim'];

  foreach ($seq as $i => $step) {
    if (!is_array($step)) return "Passo #$i inválido (objeto esperado).";

    $tipo = $step['tipo'] ?? null;
    if (!in_array($tipo, $allowed, true)) {
      return "Passo #$i com tipo inválido.";
    }

    if ($tipo === 'texto') {
      if (!isset($step['conteudo']) || trim((string)$step['conteudo']) === '') {
        return "Passo #$i texto sem conteúdo.";
      }
    }

    // 2) validar URL também para 'video'
    if (in_array($tipo, ['audio','imagem','pdf','video'], true)) {
      if (!isset($step['url']) || trim((string)$step['url']) === '') {
        return "Passo #$i ($tipo) sem URL.";
      }
      // legenda é opcional
    }

    // 3) aceitar 'segundos' OU 'min/max'
    if ($tipo === 'esperar') {
      if (array_key_exists('segundos', $step)) {
        $seg = (int)$step['segundos'];
        if ($seg < 0) return "Passo #$i esperar inválido (segundos < 0).";
      } else {
        $min = (int)($step['min'] ?? 0);
        $max = (int)($step['max'] ?? 0);
        if ($min < 0 || $max < $min) {
          return "Passo #$i esperar com faixa inválida.";
        }
      }
    }
  }
  return null;
}


try {
  switch ($action) {
    // Lista completa (para a página /funis)
    case 'list': {
      $st = $pdo->prepare("
        SELECT id, nome, status, versao, created_at, updated_at
          FROM funis
         WHERE user_id = :u
         ORDER BY updated_at DESC
      ");
      $st->execute([':u' => $userId]);
      jexit(['ok' => true, 'data' => $st->fetchAll(PDO::FETCH_ASSOC)]);
    }

    // Opções publicadas (para o select na criação de campanha)
    case 'list_options': {
      $st = $pdo->prepare("
        SELECT id, nome, versao
          FROM funis
         WHERE user_id = :u AND status='published'
         ORDER BY lower(nome)
      ");
      $st->execute([':u' => $userId]);
      jexit(['ok' => true, 'data' => $st->fetchAll(PDO::FETCH_ASSOC)]);
    }

    // Carrega 1 (para edição)
    case 'get': {
      $id = $_GET['id'] ?? '';
      $st = $pdo->prepare("
        SELECT id, nome, status, versao, sequencia, created_at, updated_at
          FROM funis
         WHERE id = :id AND user_id = :u
         LIMIT 1
      ");
      $st->execute([':id' => $id, ':u' => $userId]);
      $row = $st->fetch(PDO::FETCH_ASSOC);
      if (!$row) jexit(['ok' => false, 'error' => 'Funil não encontrado'], 404);
      jexit(['ok' => true, 'data' => $row]);
    }

    // Cria ou Atualiza (rascunho)
    case 'save': {
      $in = json_decode(file_get_contents('php://input'), true) ?? [];
      $id   = $in['id']   ?? null; // se vier, atualiza
      $nome = trim((string)($in['nome'] ?? ''));
      $seq  = $in['sequencia'] ?? [];

      if ($nome === '') jexit(['ok' => false, 'error' => 'Informe o nome do funil.'], 422);
      if (($err = validate_sequence($seq)) !== null) jexit(['ok' => false, 'error' => $err], 422);

      if ($id) {
        // update
        $st = $pdo->prepare("
          UPDATE funis
             SET nome=:n, sequencia=:s::jsonb, updated_at=NOW()
           WHERE id=:id AND user_id=:u
        ");
        $st->execute([':n'=>$nome, ':s'=>json_encode($seq, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES), ':id'=>$id, ':u'=>$userId]);
        jexit(['ok'=>true,'id'=>$id,'status'=>'draft_or_published_kept']);
      } else {
        // create
        $st = $pdo->prepare("
          INSERT INTO funis (user_id, nome, sequencia)
          VALUES (:u, :n, :s::jsonb)
          RETURNING id
        ");
        $st->execute([':u'=>$userId, ':n'=>$nome, ':s'=>json_encode($seq, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES)]);
        $newId = $st->fetchColumn();
        jexit(['ok'=>true,'id'=>$newId]);
      }
    }

    // Publica (incrementa versão e marca published)
    case 'publish': {
      $id = $_POST['id'] ?? '';
      if ($id === '') jexit(['ok'=>false,'error'=>'ID inválido'],422);

      // valida antes de publicar
      $g = $pdo->prepare("SELECT sequencia, versao FROM funis WHERE id=:id AND user_id=:u");
      $g->execute([':id'=>$id, ':u'=>$userId]);
      $row = $g->fetch(PDO::FETCH_ASSOC);
      if (!$row) jexit(['ok'=>false,'error'=>'Funil não encontrado'],404);

      $seq = is_string($row['sequencia']) ? json_decode($row['sequencia'], true) : $row['sequencia'];
      if (($err = validate_sequence($seq)) !== null) jexit(['ok'=>false,'error'=>$err],422);

      $v = (int)($row['versao'] ?? 1) + 1; // nova versão
      $u = $pdo->prepare("UPDATE funis SET status='published', versao=:v, updated_at=NOW() WHERE id=:id AND user_id=:u");
      $u->execute([':v'=>$v, ':id'=>$id, ':u'=>$userId]);

      jexit(['ok'=>true,'id'=>$id,'versao'=>$v,'status'=>'published']);
    }

    // Apaga
    case 'delete': {
      $id = $_POST['id'] ?? '';
      if ($id === '') jexit(['ok'=>false,'error'=>'ID inválido'],422);
      $d = $pdo->prepare("DELETE FROM funis WHERE id=:id AND user_id=:u");
      $d->execute([':id'=>$id, ':u'=>$userId]);
      jexit(['ok'=> ($d->rowCount() > 0)]);
    }

    default:
      jexit(['ok'=>false,'error'=>'Ação inválida'],400);
  }
} catch (Throwable $e) {
  jexit(['ok'=>false,'error'=>$e->getMessage()],500);
}
