// Copyright (c) Tailscale Inc & contributors
// SPDX-License-Identifier: BSD-3-Clause

package localclient

import (
	"context"
	"fmt"

	"tailscale.com/ipn"
)

type FakeLocalClient struct {
	FakeIPNBusWatcher
	SetServeCalled    bool
	EditPrefsCalls    []*ipn.MaskedPrefs
	GetPrefsResult    *ipn.Prefs
	CertDomainsResult []string
}

func (m *FakeLocalClient) SetServeConfig(ctx context.Context, cfg *ipn.ServeConfig) error {
	m.SetServeCalled = true
	return nil
}

func (m *FakeLocalClient) EditPrefs(ctx context.Context, mp *ipn.MaskedPrefs) (*ipn.Prefs, error) {
	m.EditPrefsCalls = append(m.EditPrefsCalls, mp)
	if m.GetPrefsResult == nil {
		return &ipn.Prefs{}, nil
	}
	return m.GetPrefsResult, nil
}

func (m *FakeLocalClient) GetPrefs(ctx context.Context) (*ipn.Prefs, error) {
	if m.GetPrefsResult == nil {
		return &ipn.Prefs{}, nil
	}
	return m.GetPrefsResult, nil
}

func (f *FakeLocalClient) WatchIPNBus(ctx context.Context, mask ipn.NotifyWatchOpt) (IPNBusWatcher, error) {
	return &f.FakeIPNBusWatcher, nil
}

func (f *FakeLocalClient) CertPair(ctx context.Context, domain string) ([]byte, []byte, error) {
	return nil, nil, fmt.Errorf("CertPair not implemented")
}

func (f *FakeLocalClient) CertDomains(ctx context.Context) ([]string, error) {
	return f.CertDomainsResult, nil
}

type FakeIPNBusWatcher struct {
	NotifyChan chan ipn.Notify
}

func (f *FakeIPNBusWatcher) Close() error {
	return nil
}

func (f *FakeIPNBusWatcher) Next() (ipn.Notify, error) {
	return <-f.NotifyChan, nil
}
