// Code generated by "gen/generator.go"; DO NOT EDIT.

package provider

import (
	"context"

	"github.com/hashicorp/terraform-plugin-framework/types"
	"github.com/netascode/terraform-provider-sdwan/internal/provider/helpers"
	"github.com/tidwall/gjson"
	"github.com/tidwall/sjson"
)

type CLITemplate struct {
	Id           types.String `tfsdk:"id"`
	Version      types.Int64  `tfsdk:"version"`
	TemplateType types.String `tfsdk:"template_type"`
	Name         types.String `tfsdk:"name"`
	Description  types.String `tfsdk:"description"`
	DeviceTypes  types.List   `tfsdk:"device_types"`
	CliConfig    types.String `tfsdk:"cli_config"`
}

func (data CLITemplate) getModel() string {
	return "cli-template"
}

func (data CLITemplate) toBody(ctx context.Context) string {
	body := ""

	var device_types []string
	data.DeviceTypes.ElementsAs(ctx, &device_types, false)
	body, _ = sjson.Set(body, "deviceType", device_types)
	body, _ = sjson.Set(body, "factoryDefault", false)
	body, _ = sjson.Set(body, "templateDescription", data.Description.ValueString())
	body, _ = sjson.Set(body, "templateMinVersion", "15.0.0")
	body, _ = sjson.Set(body, "templateName", data.Name.ValueString())
	body, _ = sjson.Set(body, "templateType", "cli-template")
	body, _ = sjson.Set(body, "templateDefinition", map[string]interface{}{})

	path := "templateDefinition."
	if data.CliConfig.IsNull() {
	} else {
		body, _ = sjson.Set(body, path+"config."+"vipObjectType", "object")
		body, _ = sjson.Set(body, path+"config."+"vipType", "constant")
		body, _ = sjson.Set(body, path+"config."+"vipValue", data.CliConfig.ValueString())
	}
	return body
}

func (data *CLITemplate) fromBody(ctx context.Context, res gjson.Result) {
	if value := res.Get("deviceType"); value.Exists() {
		data.DeviceTypes = helpers.GetStringList(value.Array())
	} else {
		data.DeviceTypes = types.ListNull(types.StringType)
	}
	if value := res.Get("templateDescription"); value.Exists() && value.String() != "" {
		data.Description = types.StringValue(value.String())
	} else {
		data.Description = types.StringNull()
	}
	if value := res.Get("templateName"); value.Exists() {
		data.Name = types.StringValue(value.String())
	} else {
		data.Name = types.StringNull()
	}
	if value := res.Get("templateType"); value.Exists() {
		data.TemplateType = types.StringValue(value.String())
	} else {
		data.TemplateType = types.StringNull()
	}

	path := "templateDefinition."
	if value := res.Get(path + "config.vipType"); value.Exists() {
		if value.String() == "variableName" {
			data.CliConfig = types.StringNull()

		} else if value.String() == "ignore" {
			data.CliConfig = types.StringNull()

		} else if value.String() == "constant" {
			v := res.Get(path + "config.vipValue")
			data.CliConfig = types.StringValue(v.String())

		}
	} else {
		data.CliConfig = types.StringNull()

	}
}

func (data *CLITemplate) hasChanges(ctx context.Context, state *CLITemplate) bool {
	hasChanges := false
	if !data.CliConfig.Equal(state.CliConfig) {
		hasChanges = true
	}
	return hasChanges
}
