package collector

import (
	"github.com/gosnmp/gosnmp"
)

// SNMPCollector SNMP采集器
type SNMPCollector struct {
	client *gosnmp.GoSNMP
}

// NewSNMPCollector 创建新的SNMP采集器
func NewSNMPCollector(target, community string, version gosnmp.SnmpVersion) (*SNMPCollector, error) {
	client := &gosnmp.GoSNMP{
		Target:    target,
		Community: community,
		Version:   version,
		Port:      161,
	}

	// 连接SNMP设备
	if err := client.Connect(); err != nil {
		return nil, err
	}

	return &SNMPCollector{
		client: client,
	}, nil
}

// Close 关闭SNMP连接
func (c *SNMPCollector) Close() error {
	return c.client.Conn.Close()
}

// GetCPUUsage 获取CPU使用率
func (c *SNMPCollector) GetCPUUsage() (float64, error) {
	// 这里使用UCD-SNMP-MIB::ssCpuIdle.0 OID来获取CPU空闲率
	// 实际使用时需要根据设备类型和SNMP MIB进行调整
	oids := []string{"1.3.6.1.4.1.2021.11.11.0"}

	result, err := c.client.Get(oids)
	if err != nil {
		return 0, err
	}

	// CPU使用率 = 100 - 空闲率
	idle := float64(result.Variables[0].Value.(uint))
	return 100 - idle, nil
}

// GetMemoryUsage 获取内存使用率
func (c *SNMPCollector) GetMemoryUsage() (float64, error) {
	// 这里使用UCD-SNMP-MIB::memTotalReal.0和memAvailReal.0 OID来获取内存使用情况
	oids := []string{
		"1.3.6.1.4.1.2021.4.5.0", // 总内存
		"1.3.6.1.4.1.2021.4.6.0", // 可用内存
	}

	result, err := c.client.Get(oids)
	if err != nil {
		return 0, err
	}

	total := float64(result.Variables[0].Value.(uint))
	available := float64(result.Variables[1].Value.(uint))

	return ((total - available) / total) * 100, nil
}

// GetDiskUsage 获取磁盘使用率
func (c *SNMPCollector) GetDiskUsage(partition string) (float64, error) {
	// 这里使用UCD-SNMP-MIB::dskTotal和dskAvail OID来获取磁盘使用情况
	// 实际使用时需要根据分区索引进行调整
	oids := []string{
		"1.3.6.1.4.1.2021.9.1.6.1", // 总磁盘空间
		"1.3.6.1.4.1.2021.9.1.7.1", // 可用磁盘空间
	}

	result, err := c.client.Get(oids)
	if err != nil {
		return 0, err
	}

	total := float64(result.Variables[0].Value.(uint))
	available := float64(result.Variables[1].Value.(uint))

	return ((total - available) / total) * 100, nil
}
