package ftp_protocol_crawler

import (
	"encoding/json"
	config "git.loafle.net/overflow/overflow_probe/agent_api/config_manager"
	"git.loafle.net/overflow/overflow_probe/crawler"
)

type FTPHealthCrawler struct {
	crawler.SocketHeahthCrawler
}

func (r *FTPHealthCrawler) Internal(params config.Config) ([]byte, error) {

	b, err := r.CheckHeahth(params)
	if err != nil {
		return nil, err
	}
	return json.Marshal(b)
}

func NewFTPHealthCrawler() *FTPHealthCrawler {
	r := &FTPHealthCrawler{}
	r.SetInternal(r)
	r.SetMatcher(NewFTPMatcher())

	return r
}

////////////// Delegate.Get implement /////////////////
//type FTPProtocol struct{}
//
//func (r *FTPProtocol) Get(input *param.Input, output *param.Output) error {
//
//	rr := &protocol.HealthRequest{}
//	json.Unmarshal(input.Data, &rr)
//
//	match, err := check(input.Ip, input.Port, rr.IsSSL)
//
//	if err != nil {
//		return err
//	}
//
//
//	retVal := &protocol.HealthResponse{}
//	retVal.IsMatch = match
//
//	b, err := json.Marshal(retVal)
//
//	if err != nil {
//		return err
//	}
//
//	*output = param.Output{Data: b}
//	return nil
//}
//
//
//func connect(ip string, port uint16, ssl bool) (net.Conn, error) {
//
//	var addr string = ip
//	addr += ":"
//	addr += strconv.Itoa(int(port))
//
//	if ssl == false {
//		conn, err := net.Dial("tcp", addr)
//		if err != nil {
//			return nil, err
//		}
//		return conn, nil
//	} else {
//		conn, err := tls.Dial(
//			"tcp",
//			addr,
//			&tls.Config{
//				InsecureSkipVerify: true,
//				ServerName:         ip,
//			},
//		)
//		if err != nil {
//			return nil, err
//		}
//		return conn, nil
//	}
//}
//
//
//
//func check(ip string, port uint16, ssl bool) (bool, error) {
//
//	conn, err := connect(ip, port, ssl)
//	if err != nil {
//		return false, err
//	}
//	defer conn.Close()
//
//	m := ftp.NewFTPMatcher()
//
//	bytes := make([]byte, 1024)
//	n, _ := conn.Read(bytes)
//	p := packet.NewPacket(bytes, n)
//	if m.Match(0, p, nil) == false {
//		return false, nil
//	}
//
//	for i := 0; i < m.PacketCount(); i++ {
//
//		pack := m.Packet(i)
//		conn.Write(pack.Buffer)
//
//		n, _ := conn.Read(bytes)
//		p := packet.NewPacket(bytes, n)
//
//		if matchFtp(i+1, p) == false {
//			return false, nil
//		}
//	}
//
//	return true, nil
//}
//
//func matchFtp(idx int, packet *packet.Packet) bool {
//	result := false
//
//	if packet == nil || packet.Buffer == nil || packet.Len == 0 {
//		log.Println("Packet nil")
//		return result
//	}
//
//	str := string(packet.Buffer)
//
//	code := str[:3]
//
//	if idx == 0 {
//		switch code {
//		case statusNewConnectOK, statusReadyServer:
//			//fmt.Println(code)
//			result = true
//			break
//		}
//	} else if idx == 1 {
//		switch code {
//		case statusSystemNameOK, statusSyntaxErr, statusParamSyntaxErr, statusNotUseCMD, statusUserLoginRequied:
//			//fmt.Println(code)
//			result = true
//			break
//		}
//	} else if idx == 2 {
//		switch code {
//		case statusIncorrectCMD, statusParamSyntaxErr, statusNotUseCMD, statusNeedUserId, statusUserLoginRequied:
//			//fmt.Println(code)
//			result = true
//			break
//		}
//	} else if idx == 3 {
//		switch code {
//		case statusCloseConnect, statusSyntaxErr:
//			//fmt.Println(code)
//			result = true
//			break
//		}
//	}
//
//	return result
//}
//
//func start() {
//
//	rpc.SetDelegate(new(FTPProtocol))
//	err := rpc.StartJSONRPC()
//	if err != nil {
//		log.Fatal(err)
//	}
//}
//
//func main() {
//	start()
//}
