//go:build (linux && !android) || freebsd

package dns

import (
	"fmt"
	"net/netip"
	"os"
	"path/filepath"

	"github.com/netbirdio/netbird/client/internal/statemanager"
)

type ShutdownState struct {
	ManagerType osManagerType
	DNSAddress  netip.Addr
	WgIface     string
}

func (s *ShutdownState) Name() string {
	return "dns_state"
}

func (s *ShutdownState) Cleanup() error {
	manager, err := newHostManagerFromType(s.WgIface, s.ManagerType)
	if err != nil {
		return fmt.Errorf("create previous host manager: %w", err)
	}

	if err := manager.restoreUncleanShutdownDNS(&s.DNSAddress); err != nil {
		return fmt.Errorf("restore unclean shutdown dns: %w", err)
	}

	return nil
}

// TODO: move file contents to state manager
func createUncleanShutdownIndicator(sourcePath string, dnsAddressStr string, stateManager *statemanager.Manager) error {
	dnsAddress, err := netip.ParseAddr(dnsAddressStr)
	if err != nil {
		return fmt.Errorf("parse dns address %s: %w", dnsAddressStr, err)
	}

	dir := filepath.Dir(fileUncleanShutdownResolvConfLocation)
	if err := os.MkdirAll(dir, os.FileMode(0755)); err != nil {
		return fmt.Errorf("create dir %s: %w", dir, err)
	}

	if err := copyFile(sourcePath, fileUncleanShutdownResolvConfLocation); err != nil {
		return fmt.Errorf("create %s: %w", sourcePath, err)
	}

	state := &ShutdownState{
		ManagerType: fileManager,
		DNSAddress:  dnsAddress,
	}
	if err := stateManager.UpdateState(state); err != nil {
		return fmt.Errorf("update state: %w", err)
	}

	return nil
}