<?php

ini_set('display_errors', '0');
ini_set('log_errors', '1');

header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: POST");
header("Access-Control-Allow-Headers: Content-Type, X-Gatoflix-Token");

require_once '/var/www/gatoflix-config/conexao.php';
require_once '/var/www/gatoflix-config/validar_token.php';

// ---------------------------------------------------------
// Somente administradores
// ---------------------------------------------------------

if ($perfil_usuario_autenticado !== 'admin') {

    http_response_code(403);

    echo json_encode([
        "sucesso" => false,
        "mensagem" => "Acesso negado."
    ], JSON_UNESCAPED_UNICODE);

    $conexao->close();
    exit;
}

// ---------------------------------------------------------
// Lê JSON
// ---------------------------------------------------------

$entrada = json_decode(
    file_get_contents("php://input"),
    true
);

if (!is_array($entrada)) {

    http_response_code(400);

    echo json_encode([
        "sucesso" => false,
        "mensagem" => "Dados inválidos."
    ], JSON_UNESCAPED_UNICODE);

    $conexao->close();
    exit;
}

// ---------------------------------------------------------
// IDs
// ---------------------------------------------------------

$idColecao = filter_var(
    $entrada['id_colecao'] ?? null,
    FILTER_VALIDATE_INT
);

$idGrupo = filter_var(
    $entrada['id_grupo'] ?? null,
    FILTER_VALIDATE_INT
);

$idConteudo = filter_var(
    $entrada['id_conteudo'] ?? null,
    FILTER_VALIDATE_INT
);

// ---------------------------------------------------------
// Validações
// ---------------------------------------------------------

if (
    $idColecao === false ||
    $idColecao <= 0
) {

    http_response_code(400);

    echo json_encode([
        "sucesso" => false,
        "mensagem" => "Coleção inválida."
    ], JSON_UNESCAPED_UNICODE);

    $conexao->close();
    exit;
}

if (
    $idGrupo === false ||
    $idGrupo <= 0
) {

    http_response_code(400);

    echo json_encode([
        "sucesso" => false,
        "mensagem" => "Grupo inválido."
    ], JSON_UNESCAPED_UNICODE);

    $conexao->close();
    exit;
}

if (
    $idConteudo === false ||
    $idConteudo <= 0
) {

    http_response_code(400);

    echo json_encode([
        "sucesso" => false,
        "mensagem" => "Conteúdo inválido."
    ], JSON_UNESCAPED_UNICODE);

    $conexao->close();
    exit;
}

$transacaoIniciada = false;

try {

    // -----------------------------------------------------
    // Inicia transação
    // -----------------------------------------------------

    $conexao->begin_transaction();

    $transacaoIniciada = true;

    // -----------------------------------------------------
    // Confirma que o grupo pertence à coleção
    // Bloqueia o grupo durante remoção/reorganização
    // -----------------------------------------------------

    $stmtGrupo = $conexao->prepare("
        SELECT
            id,
            nome
        FROM colecoes_grupos
        WHERE id = ?
          AND id_colecao = ?
        LIMIT 1
        FOR UPDATE
    ");

    if (!$stmtGrupo) {
        throw new Exception(
            "Erro ao preparar consulta do grupo."
        );
    }

    $stmtGrupo->bind_param(
        "ii",
        $idGrupo,
        $idColecao
    );

    $stmtGrupo->execute();

    $resultadoGrupo =
        $stmtGrupo->get_result();

    if ($resultadoGrupo->num_rows === 0) {

        $stmtGrupo->close();

        $conexao->rollback();
        $transacaoIniciada = false;

        http_response_code(404);

        echo json_encode([
            "sucesso" => false,
            "mensagem" =>
                "Grupo não encontrado nesta coleção."
        ], JSON_UNESCAPED_UNICODE);

        $conexao->close();
        exit;
    }

    $grupo =
        $resultadoGrupo->fetch_assoc();

    $nomeGrupo =
        $grupo['nome'];

    $stmtGrupo->close();

    // -----------------------------------------------------
    // Confirma que o conteúdo está vinculado ao grupo
    // e captura sua ordem atual
    // -----------------------------------------------------

    $stmtVinculo = $conexao->prepare("
        SELECT
            ordem_no_grupo
        FROM colecoes_grupos_conteudos
        WHERE id_grupo = ?
          AND id_conteudo = ?
          AND id_colecao = ?
        LIMIT 1
    ");

    if (!$stmtVinculo) {
        throw new Exception(
            "Erro ao preparar consulta do vínculo."
        );
    }

    $stmtVinculo->bind_param(
        "iii",
        $idGrupo,
        $idConteudo,
        $idColecao
    );

    $stmtVinculo->execute();

    $resultadoVinculo =
        $stmtVinculo->get_result();

    if ($resultadoVinculo->num_rows === 0) {

        $stmtVinculo->close();

        $conexao->rollback();
        $transacaoIniciada = false;

        http_response_code(404);

        echo json_encode([
            "sucesso" => false,
            "mensagem" =>
                "Este conteúdo não pertence ao grupo."
        ], JSON_UNESCAPED_UNICODE);

        $conexao->close();
        exit;
    }

    $vinculo =
        $resultadoVinculo->fetch_assoc();

    $ordemRemovida =
        (int) $vinculo['ordem_no_grupo'];

    $stmtVinculo->close();

    // -----------------------------------------------------
    // Remove o vínculo
    // -----------------------------------------------------

    $stmtRemover = $conexao->prepare("
        DELETE FROM colecoes_grupos_conteudos
        WHERE id_grupo = ?
          AND id_conteudo = ?
          AND id_colecao = ?
    ");

    if (!$stmtRemover) {
        throw new Exception(
            "Erro ao preparar remoção do conteúdo."
        );
    }

    $stmtRemover->bind_param(
        "iii",
        $idGrupo,
        $idConteudo,
        $idColecao
    );

    if (!$stmtRemover->execute()) {
        throw new Exception(
            "Erro ao remover conteúdo do grupo."
        );
    }

    if ($stmtRemover->affected_rows !== 1) {

        $stmtRemover->close();

        throw new Exception(
            "Nenhum vínculo foi removido."
        );
    }

    $stmtRemover->close();

    // -----------------------------------------------------
    // Reorganiza os conteúdos posteriores
    // -----------------------------------------------------

    $stmtOrdem = $conexao->prepare("
        UPDATE colecoes_grupos_conteudos
        SET ordem_no_grupo = ordem_no_grupo - 1
        WHERE id_grupo = ?
          AND id_colecao = ?
          AND ordem_no_grupo > ?
    ");

    if (!$stmtOrdem) {
        throw new Exception(
            "Erro ao preparar reorganização do grupo."
        );
    }

    $stmtOrdem->bind_param(
        "iii",
        $idGrupo,
        $idColecao,
        $ordemRemovida
    );

    if (!$stmtOrdem->execute()) {
        throw new Exception(
            "Erro ao reorganizar conteúdos do grupo."
        );
    }

    $stmtOrdem->close();

    // -----------------------------------------------------
    // Confirma transação
    // -----------------------------------------------------

    $conexao->commit();

    $transacaoIniciada = false;

    // -----------------------------------------------------
    // Resposta
    // -----------------------------------------------------

    echo json_encode([
        "sucesso" => true,
        "mensagem" =>
            "Conteúdo removido do grupo com sucesso.",
        "vinculo_removido" => [
            "id_colecao" =>
                (int) $idColecao,
            "id_grupo" =>
                (int) $idGrupo,
            "nome_grupo" =>
                $nomeGrupo,
            "id_conteudo" =>
                (int) $idConteudo,
            "ordem_anterior" =>
                $ordemRemovida
        ]
    ], JSON_UNESCAPED_UNICODE);

} catch (Throwable $e) {

    if ($transacaoIniciada) {
        $conexao->rollback();
    }

    error_log(
        "Erro em remover_conteudo_grupo.php: " .
        $e->getMessage()
    );

    http_response_code(500);

    echo json_encode([
        "sucesso" => false,
        "mensagem" =>
            "Não foi possível remover o conteúdo do grupo."
    ], JSON_UNESCAPED_UNICODE);
}

$conexao->close();

?>
