package wizard

import (
	"encoding/json"
	"fmt"
	"net"
	"os"
	"path/filepath"
	"sunhpc/pkg/utils"

	"github.com/charmbracelet/bubbles/textinput"
)

// saveConfig 保存配置到文件
func (m *model) saveConfig() error {
	configPath := GetConfigPath()

	// 确保目录存在
	dir := filepath.Dir(configPath)
	if err := os.MkdirAll(dir, 0755); err != nil {
		return fmt.Errorf("创建配置目录失败：%w", err)
	}

	// 序列化配置
	data, err := json.MarshalIndent(m.config, "", "  ")
	if err != nil {
		return fmt.Errorf("序列化配置失败：%w", err)
	}

	// 写入文件
	if err := os.WriteFile(configPath, data, 0644); err != nil {
		return fmt.Errorf("保存配置文件失败：%w", err)
	}

	return nil
}

// loadConfig 从文件加载配置
func loadConfig() (*Config, error) {
	configPath := GetConfigPath()

	data, err := os.ReadFile(configPath)
	if err != nil {
		return nil, fmt.Errorf("读取配置文件失败：%w", err)
	}

	var cfg Config
	if err := json.Unmarshal(data, &cfg); err != nil {
		return nil, fmt.Errorf("解析配置文件失败：%w", err)
	}

	return &cfg, nil
}

// 以下是 model.go 中调用的保存方法
func (m *model) saveCurrentPage() {
	switch m.currentPage {
	case PageData:
		m.saveDataPage()
	case PagePublicNetwork:
		m.savePublicNetworkPage()
	case PageInternalNetwork:
		m.saveInternalNetworkPage()
	case PageDNS:
		m.saveDNSPage()
	}
}

func (m *model) saveDataPage() {
	if len(m.textInputs) >= 8 {
		m.config.HomePage = m.textInputs[0].Value()
		m.config.Hostname = m.textInputs[1].Value()
		m.config.Country = m.textInputs[2].Value()
		m.config.Region = m.textInputs[3].Value()
		m.config.Timezone = m.textInputs[4].Value()
		m.config.DBAddress = m.textInputs[5].Value()
		m.config.DataAddress = m.textInputs[6].Value()
	}
}

func (m *model) savePublicNetworkPage() {
	if len(m.textInputs) >= 4 {
		m.config.PublicInterface = m.textInputs[0].Value()
		m.config.PublicIPAddress = m.textInputs[1].Value()
		m.config.PublicNetmask = m.textInputs[2].Value()
		m.config.PublicGateway = m.textInputs[3].Value()
	}
}

func (m *model) saveInternalNetworkPage() {
	if len(m.textInputs) >= 3 {
		m.config.InternalInterface = m.textInputs[0].Value()
		m.config.InternalIPAddress = m.textInputs[1].Value()
		m.config.InternalNetmask = m.textInputs[2].Value()
	}
}

func (m *model) saveDNSPage() {
	if len(m.textInputs) >= 2 {
		m.config.DNSPrimary = m.textInputs[0].Value()
		m.config.DNSSecondary = m.textInputs[1].Value()
	}
}

// initPageInputs 初始化当前页面的输入框
func (m *model) initPageInputs() {
	m.textInputs = make([]textinput.Model, 0)

	switch m.currentPage {
	case PageData:
		fields := []struct{ label, value string }{
			{"Homepage", m.config.HomePage},
			{"Hostname", m.config.Hostname},
			{"Country", m.config.Country},
			{"Region", m.config.Region},
			{"Timezone", m.config.Timezone},
			{"DB Path", m.config.DBAddress},
			{"Software", m.config.DataAddress},
		}
		for _, f := range fields {
			ti := textinput.New()
			ti.Placeholder = ""
			ti.Placeholder = f.label
			ti.SetValue(f.value)
			ti.Width = 50
			m.textInputs = append(m.textInputs, ti)
		}
		m.focusIndex = 0
		if len(m.textInputs) > 0 {
			m.textInputs[0].Focus()
		}
		m.inputLabels = []string{"Homepage", "Hostname", "Country", "Region", "Timezone", "DBPath", "Software"}

	case PagePublicNetwork:
		fields := []struct{ label, value string }{
			{"Public Interface", m.config.PublicInterface},
			{"Public IP Address", m.config.PublicIPAddress},
			{"Public Netmask", m.config.PublicNetmask},
			{"Public Gateway", m.config.PublicGateway},
		}
		for _, f := range fields {
			ti := textinput.New()
			ti.Placeholder = ""
			ti.Placeholder = f.label
			ti.SetValue(f.value)
			ti.Width = 50
			m.textInputs = append(m.textInputs, ti)
		}
		m.focusIndex = 0
		if len(m.textInputs) > 0 {
			m.textInputs[0].Focus()
		}
		m.inputLabels = []string{"Public Interface", "Public IP Address", "Public Netmask", "Public Gateway"}

	case PageInternalNetwork:
		fields := []struct{ label, value string }{
			{"Internal Interface", m.config.InternalInterface},
			{"Internal IP Address", m.config.InternalIPAddress},
			{"Internal Netmask", m.config.InternalNetmask},
		}
		for _, f := range fields {
			ti := textinput.New()
			ti.Placeholder = f.label
			ti.SetValue(f.value)
			ti.Width = 50
			m.textInputs = append(m.textInputs, ti)
		}
		m.focusIndex = 0
		if len(m.textInputs) > 0 {
			m.textInputs[0].Focus()
		}
		m.inputLabels = []string{"Internal Interface", "Internal IP", "Internal Mask"}

	case PageDNS:
		fields := []struct{ label, value string }{
			{"Primary   DNS", m.config.DNSPrimary},
			{"Secondary DNS", m.config.DNSSecondary},
		}
		for _, f := range fields {
			ti := textinput.New()
			ti.Placeholder = f.label
			ti.SetValue(f.value)
			ti.Width = 50
			m.textInputs = append(m.textInputs, ti)
		}
		m.focusIndex = 0
		if len(m.textInputs) > 0 {
			m.textInputs[0].Focus()
		}
		m.inputLabels = []string{"Pri DNS", "Sec DNS"}
	}
}

// 获取系统网络接口
func getNetworkInterfaces() []string {
	// 实现获取系统网络接口的逻辑
	// 例如：使用 net.Interface() 函数获取系统网络接口
	// 返回一个字符串切片，包含系统网络接口的名称
	interfaces, err := net.Interfaces()
	if err != nil {
		return []string{utils.NoAvailableNetworkInterfaces}
	}

	var result []string
	for _, iface := range interfaces {
		// 跳过 loopback 接口
		if iface.Flags&net.FlagLoopback != 0 {
			continue
		}
		result = append(result, iface.Name)
	}

	if len(result) == 0 {
		return []string{utils.NoAvailableNetworkInterfaces}
	}
	return result
}
