package processor

import (
	"encoding/json"
	"fmt"
	"strings"

	"nms_nbi/src/framework/logger"
	"nms_nbi/src/framework/vo/result"
	"nms_nbi/src/modules/ws/model"

	"github.com/shirou/gopsutil/v3/net"
	"github.com/shirou/gopsutil/v3/process"
)

// GetNetConnections 获取网络连接进程
func GetNetConnections(requestID string, data any) ([]byte, error) {
	msgByte, _ := json.Marshal(data)
	var query model.NetConnectQuery
	err := json.Unmarshal(msgByte, &query)
	if err != nil {
		logger.Warnf("ws processor GetNetConnections err: %s", err.Error())
		return nil, fmt.Errorf("query data structure error")
	}

	dataArr := []model.NetConnectData{}
	for _, netType := range [...]string{"tcp", "udp"} {
		connections, err := net.Connections(netType)
		if err != nil {
			continue
		}
		for _, conn := range connections {
			if query.ProcessID > 0 && query.ProcessID != conn.Pid {
				continue
			}
			proc, err := process.NewProcess(conn.Pid)
			if err == nil {
				name, _ := proc.Name()
				if name != "" && query.ProcessName != "" && !strings.Contains(name, query.ProcessName) {
					continue
				}
				if query.Port > 0 && query.Port != int32(conn.Laddr.Port) && query.Port != int32(conn.Raddr.Port) {
					continue
				}
				dataArr = append(dataArr, model.NetConnectData{
					Type:   netType,
					Status: conn.Status,
					Laddr:  conn.Laddr,
					Raddr:  conn.Raddr,
					PID:    conn.Pid,
					Name:   name,
				})
			}
		}
	}

	resultByte, err := json.Marshal(result.Ok(map[string]any{
		"requestId": requestID,
		"data":      dataArr,
	}))
	return resultByte, err
}
