package jsonloader

import (
	"testing"

	"github.com/databricks/cli/libs/dyn/convert"
	"github.com/databricks/cli/libs/dyn/dynassert"
	"github.com/databricks/databricks-sdk-go/service/jobs"
)

const jsonData = `
{
    "job_id": 123,
    "new_settings": {
        "name": "xxx",
        "email_notifications": {
            "on_start": [],
            "on_success": [],
            "on_failure": []
        },
        "webhook_notifications": {
            "on_start": [],
            "on_failure": []
        },
        "notification_settings": {
            "no_alert_for_skipped_runs": true,
            "no_alert_for_canceled_runs": true
        },
        "timeout_seconds": 0,
        "max_concurrent_runs": 1,
        "tasks": [
            {
                "task_key": "xxx",
                "email_notifications": {},
                "notification_settings": {},
                "timeout_seconds": 0,
                "max_retries": 0,
                "min_retry_interval_millis": 0,
                "retry_on_timeout": "true"
            }
        ]
    }
}
`

func TestJsonLoader(t *testing.T) {
	v, err := LoadJSON([]byte(jsonData), "(inline)")
	dynassert.NoError(t, err)

	var r jobs.ResetJob
	err = convert.ToTyped(&r, v)
	dynassert.NoError(t, err)
}

const malformedMap = `
{
    "job_id": 123,
    "new_settings": {
        "name": "xxx",
        "wrong",
    }
}
`

func TestJsonLoaderMalformedMap(t *testing.T) {
	_, err := LoadJSON([]byte(malformedMap), "(inline)")
	dynassert.ErrorContains(t, err, "error decoding JSON at (inline):6:16: invalid character ',' after object key")
}

const malformedArray = `
{
    "job_id": 123,
    "new_settings": {
        "name": "xxx",
        "tasks": [1, "asd",]
    }
}`

func TestJsonLoaderMalformedArray(t *testing.T) {
	_, err := LoadJSON([]byte(malformedArray), "path/to/file.json")
	dynassert.ErrorContains(t, err, "error decoding JSON at path/to/file.json:6:28: invalid character ']' looking for beginning of value")
}

const eofData = `
{
    "job_id": 123,
    "new_settings": {
        "name": "xxx",`

func TestJsonLoaderEOF(t *testing.T) {
	_, err := LoadJSON([]byte(eofData), "path/to/file.json")
	dynassert.ErrorContains(t, err, "unexpected end of JSON input")
}