package api

import (
	"context"
	"time"

	subpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/subscriptionmanagement"
	nbi "code.fbi.h-da.de/danet/gosdn/controller/northbound/client"
)

// ResetAllSubscriptions stops all running subscriptions and restarts them the same way they ran before.
func ResetAllSubscriptions(ctx context.Context, addr string) (*subpb.ResetAllSubscriptionsResponse, error) {
	subClient, err := nbi.SubManagementClient(addr, dialOptions...)
	if err != nil {
		return nil, err
	}

	req := &subpb.ResetAllSubscriptionsRequest{
		Timestamp: time.Now().UnixNano(),
	}

	return subClient.ResetAllSubscriptions(ctx, req)
}

// GetAll returns information about all running subscriptions.
func GetAll(ctx context.Context, addr string) (*subpb.GetAllResponse, error) {
	subClient, err := nbi.SubManagementClient(addr, dialOptions...)
	if err != nil {
		return nil, err
	}

	req := &subpb.GetAllRequest{
		Timestamp: time.Now().UnixNano(),
	}

	return subClient.GetAll(ctx, req)
}

// Get fetches detailed info for one specific available subscription.
func Get(ctx context.Context, addr string, subID string) (*subpb.GetResponse, error) {
	subClient, err := nbi.SubManagementClient(addr, dialOptions...)
	if err != nil {
		return nil, err
	}

	req := &subpb.GetRequest{
		Timestamp: time.Now().UnixNano(),
		Subid:     subID,
	}

	return subClient.Get(ctx, req)
}

// Delete stops and removes one specific running subscription is a no-op if object connected to ID does not exist.
func Delete(ctx context.Context, addr string, subID string) (*subpb.DeleteResponse, error) {
	subClient, err := nbi.SubManagementClient(addr, dialOptions...)
	if err != nil {
		return nil, err
	}

	req := &subpb.DeleteRequest{
		Timestamp: time.Now().UnixNano(),
		Subid:     subID,
	}

	return subClient.Delete(ctx, req)
}

// Add creates a new subscription for the network element matching the provided ID using the provided subscribe options.
func Add(ctx context.Context, addr string, mneID string, subscribeOptions *subpb.Subscription) (*subpb.AddResponse, error) {
	subClient, err := nbi.SubManagementClient(addr, dialOptions...)
	if err != nil {
		return nil, err
	}

	req := &subpb.AddRequest{
		Timestamp:    time.Now().UnixNano(),
		Mneid:        mneID,
		Subscription: subscribeOptions,
	}

	return subClient.Add(ctx, req)
}