package publicip

import (
	"fmt"
	"os"
	"reflect"

	"github.com/qdm12/gluetun/internal/configuration/settings"
	"github.com/qdm12/gluetun/internal/publicip/api"
)

func (l *Loop) update(partialUpdate settings.PublicIP) (err error) {
	l.settingsMutex.Lock()
	defer l.settingsMutex.Unlock()

	updatedSettings, err := l.settings.UpdateWith(partialUpdate)
	if err != nil {
		return err
	}

	if *l.settings.IPFilepath != *updatedSettings.IPFilepath {
		switch {
		case *l.settings.IPFilepath == "":
			err = persistPublicIP(*updatedSettings.IPFilepath,
				l.ipData.IP.String(), l.puid, l.pgid)
			if err != nil {
				return fmt.Errorf("persisting ip data: %w", err)
			}
		case *updatedSettings.IPFilepath == "":
			err = os.Remove(*l.settings.IPFilepath)
			if err != nil {
				return fmt.Errorf("removing ip data file path: %w", err)
			}
		default:
			err = os.Rename(*l.settings.IPFilepath, *updatedSettings.IPFilepath)
			if err != nil {
				return fmt.Errorf("renaming ip data file path: %w", err)
			}
		}
	}

	if !reflect.DeepEqual(l.settings.APIs, updatedSettings.APIs) {
		newFetchers, err := api.New(makeNameTokenPairs(updatedSettings.APIs), l.httpClient)
		if err != nil {
			return fmt.Errorf("creating fetchers: %w", err)
		}

		l.fetcher.UpdateFetchers(newFetchers)
	}

	l.settings = updatedSettings

	return nil
}
