package api

import (
	"testing"

	ppb "code.fbi.h-da.de/danet/api/go/gosdn/pnd"
	spb "code.fbi.h-da.de/danet/api/go/gosdn/southbound"
	tpb "code.fbi.h-da.de/danet/api/go/gosdn/transport"
	"code.fbi.h-da.de/danet/gosdn/nucleus"
	log "github.com/sirupsen/logrus"
	"github.com/spf13/viper"
)

func Test_Init(t *testing.T) {
	viper.SetConfigFile("./api_test.toml")
	if err := Init(bufnet); err != nil {
		t.Error(err)
	}
}

func Test_GetIds(t *testing.T) {
	resp, err := GetIds(bufnet)
	if err != nil {
		t.Error(err)
		return
	}
	log.Info(resp)
}

func Test_AddPnd(t *testing.T) {
	sbi := nucleus.NewSBI(spb.Type_OPENCONFIG)
	resp, err := AddPnd(bufnet, "test", "test pnd", sbi.ID().String())
	if err != nil {
		t.Error(err)
		return
	}
	log.Info(resp)
}

func Test_GetPnd(t *testing.T) {
	resp, err := GetPnd(bufnet, pndID)
	if err != nil {
		t.Error(err)
		return
	}
	got := resp.Pnd[0].Id
	if got != pndID {
		t.Errorf("PND ID is %v, expected %v", got, pndID)
	}
}

func Test_GetChanges(t *testing.T) {
	resp, err := getChanges(bufnet, pndID)
	if err != nil {
		t.Error(err)
		return
	}
	log.Info(resp)
}

func Test_CommitConfirm(t *testing.T) {
	resp, err := commit(bufnet, pndID, changeID)
	if err != nil {
		t.Error(err)
		return
	}
	log.Info(resp)

	resp, err = confirm(bufnet, pndID, changeID)
	if err != nil {
		t.Error(err)
		return
	}
	log.Info(resp)

}

func Test_AddDevice(t *testing.T) {
	opt := &tpb.TransportOption{
		Address:  "test",
		Username: "test",
		Password: "test",
		TransportOption: &tpb.TransportOption_GnmiTransportOption{
			GnmiTransportOption: &tpb.GnmiTransportOption{},
		},
	}
	resp, err := addDevice(bufnet, "test", opt, sbiUUID, pndUUID)
	if err != nil {
		t.Error(err)
		return
	}
	log.Info(resp)
}

func Test_GetDevice(t *testing.T) {
	resp, err := getDevice(bufnet, pndID, ondID)
	if err != nil {
		t.Error(err)
		return
	}
	got := resp.Ond[0].Id
	if got != ondID {
		t.Errorf("PND ID is %v, expected %v", got, ondID)
	}
}

func Test_Update(t *testing.T) {
	resp, err := changeRequest(bufnet, ondID, pndID, "", "", ppb.ApiOperation_UPDATE)
	if err != nil {
		t.Error(err)
		return
	}
	log.Info(resp)
}

func Test_Replace(t *testing.T) {
	resp, err := changeRequest(bufnet, ondID, pndID, "", "", ppb.ApiOperation_REPLACE)
	if err != nil {
		t.Error(err)
		return
	}
	log.Info(resp)
}

func Test_Delete(t *testing.T) {
	resp, err := changeRequest(bufnet, ondID, pndID, "", "", ppb.ApiOperation_DELETE)
	if err != nil {
		t.Error(err)
		return
	}
	log.Info(resp)
}