<?php
/**
 * api/planos.php — Cadastro de Planos (nome, meses e valor).
 * Ex: "Plano 1 Mês" / 1 mês / R$ 35,00
 *     "Plano Trimestral" / 3 meses / R$ 90,00
 *
 * Esses planos alimentam o combo "Plano" no cadastro de clientes: ao
 * selecionar um plano, o Valor é preenchido automaticamente e, na hora de
 * Renovar, o cliente ganha exatamente a quantidade de meses configurada aqui.
 */

require_once __DIR__ . '/../core/db_helper.php';
require_once __DIR__ . '/../core/auth.php';

header('Content-Type: application/json; charset=utf-8');
$usuarioLogado = exigir_login();
$acao = $_GET['acao'] ?? $_POST['acao'] ?? 'listar';
$corpo = json_decode(file_get_contents('php://input'), true) ?? $_POST;

function responder_plano($d, $c = 200)
{
    http_response_code($c);
    echo json_encode($d, JSON_UNESCAPED_UNICODE);
    exit;
}

/** Só o ADM ou quem criou o plano pode editar/excluir. */
function pode_gerenciar_plano(array $usuarioLogado, array $plano): bool
{
    if ($usuarioLogado['nivel'] === 'ADM') {
        return true;
    }
    return ($plano['criado_por'] ?? null) === $usuarioLogado['id'];
}

switch ($acao) {

    case 'listar':
        // Cada usuário (ADM, Revenda ou Sub-Revenda) só vê os planos que
        // ELE MESMO cadastrou — são privados/independentes por nível. O
        // ADM é a única exceção: vê os planos de todo mundo.
        $planos = db_read('planos');
        if ($usuarioLogado['nivel'] !== 'ADM') {
            $planos = array_values(array_filter($planos, fn($p) => ($p['criado_por'] ?? null) === $usuarioLogado['id']));
        }
        responder_plano(['ok' => true, 'planos' => $planos]);
        break;

    case 'criar':
        // Qualquer nível pode criar seu próprio plano (privado, só ele e o
        // ADM enxergam).
        $nome = trim($corpo['nome'] ?? '');
        $meses = (int) ($corpo['meses'] ?? 0);
        $valor = (float) ($corpo['valor'] ?? 0);

        if (!$nome || $meses < 1) {
            responder_plano(['ok' => false, 'erro' => 'Informe nome do plano e quantidade de meses válida.'], 422);
        }

        $novo = [
            'id' => gerar_id('PLN-'),
            'nome' => $nome,
            'meses' => $meses,
            'valor' => $valor,
            'criado_por' => $usuarioLogado['id'],
            'criado_em' => date('Y-m-d H:i:s'),
        ];

        db_update('planos', function (&$planos) use ($novo) {
            $planos[] = $novo;
        });

        auditoria_log($usuarioLogado['usuario'], 'PLANO_CRIADO', "{$novo['nome']} ({$novo['meses']} meses / R$ {$novo['valor']})");
        responder_plano(['ok' => true, 'plano' => $novo]);
        break;

    case 'editar':
        $id = $corpo['id'] ?? '';
        $planos = db_read('planos');
        $alvo = null;
        foreach ($planos as $p) {
            if ($p['id'] === $id) { $alvo = $p; break; }
        }
        if (!$alvo) {
            responder_plano(['ok' => false, 'erro' => 'Plano não encontrado.'], 404);
        }
        if (!pode_gerenciar_plano($usuarioLogado, $alvo)) {
            responder_plano(['ok' => false, 'erro' => 'Você não tem permissão para editar este plano.'], 403);
        }
        $atualizado = db_update('planos', function (&$planos) use ($id, $corpo) {
            foreach ($planos as &$p) {
                if ($p['id'] === $id) {
                    if (array_key_exists('nome', $corpo)) $p['nome'] = trim($corpo['nome']);
                    if (array_key_exists('meses', $corpo)) $p['meses'] = (int) $corpo['meses'];
                    if (array_key_exists('valor', $corpo)) $p['valor'] = (float) $corpo['valor'];
                    return $p;
                }
            }
            return null;
        });
        if (!$atualizado) {
            responder_plano(['ok' => false, 'erro' => 'Plano não encontrado.'], 404);
        }
        auditoria_log($usuarioLogado['usuario'], 'PLANO_EDITADO', $id);
        responder_plano(['ok' => true, 'plano' => $atualizado]);
        break;

    case 'deletar':
        $id = $corpo['id'] ?? '';
        $planos = db_read('planos');
        $alvo = null;
        foreach ($planos as $p) {
            if ($p['id'] === $id) { $alvo = $p; break; }
        }
        if (!$alvo) {
            responder_plano(['ok' => false, 'erro' => 'Plano não encontrado.'], 404);
        }
        if (!pode_gerenciar_plano($usuarioLogado, $alvo)) {
            responder_plano(['ok' => false, 'erro' => 'Você não tem permissão para excluir este plano.'], 403);
        }
        db_update('planos', function (&$planos) use ($id) {
            $planos = array_values(array_filter($planos, fn($p) => $p['id'] !== $id));
        });
        auditoria_log($usuarioLogado['usuario'], 'PLANO_DELETADO', $id);
        responder_plano(['ok' => true]);
        break;

    default:
        responder_plano(['ok' => false, 'erro' => 'Ação inválida.'], 400);
}
