package notebook

import (
	"os"
	"path/filepath"
	"testing"

	"github.com/databricks/databricks-sdk-go/service/workspace"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func TestDetectJupyter(t *testing.T) {
	var nb bool
	var lang workspace.Language
	var err error

	nb, lang, err = DetectJupyter("./testdata/py_ipynb.ipynb")
	require.NoError(t, err)
	assert.True(t, nb)
	assert.Equal(t, workspace.LanguagePython, lang)

	nb, lang, err = DetectJupyter("./testdata/r_ipynb.ipynb")
	require.NoError(t, err)
	assert.True(t, nb)
	assert.Equal(t, workspace.LanguageR, lang)

	nb, lang, err = DetectJupyter("./testdata/scala_ipynb.ipynb")
	require.NoError(t, err)
	assert.True(t, nb)
	assert.Equal(t, workspace.LanguageScala, lang)

	nb, lang, err = DetectJupyter("./testdata/sql_ipynb.ipynb")
	require.NoError(t, err)
	assert.True(t, nb)
	assert.Equal(t, workspace.LanguageSql, lang)
}

func TestDetectJupyterInvalidJSON(t *testing.T) {
	// Create garbage file.
	dir := t.TempDir()
	path := filepath.Join(dir, "file.ipynb")
	buf := make([]byte, 128)
	err := os.WriteFile(path, buf, 0644)
	require.NoError(t, err)

	// Garbage contents means not a notebook.
	nb, _, err := DetectJupyter(path)
	require.ErrorContains(t, err, "error loading Jupyter notebook file")
	assert.False(t, nb)
}

func TestDetectJupyterNoCells(t *testing.T) {
	// Create empty JSON file.
	dir := t.TempDir()
	path := filepath.Join(dir, "file.ipynb")
	buf := []byte("{}")
	err := os.WriteFile(path, buf, 0644)
	require.NoError(t, err)

	// Garbage contents means not a notebook.
	nb, _, err := DetectJupyter(path)
	require.ErrorContains(t, err, "invalid Jupyter notebook file")
	assert.False(t, nb)
}

func TestDetectJupyterOldVersion(t *testing.T) {
	// Create empty JSON file.
	dir := t.TempDir()
	path := filepath.Join(dir, "file.ipynb")
	buf := []byte(`{ "cells": [], "metadata": {}, "nbformat": 3 }`)
	err := os.WriteFile(path, buf, 0644)
	require.NoError(t, err)

	// Garbage contents means not a notebook.
	nb, _, err := DetectJupyter(path)
	require.ErrorContains(t, err, "unsupported Jupyter notebook version")
	assert.False(t, nb)
}