package ldap_protocol_crawler

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

type LDAPHealthCrawler struct {
	crawler.SocketHeahthCrawler
}

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

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

func NewLDAPHealthCrawler() *LDAPHealthCrawler {
	r := &LDAPHealthCrawler{}
	r.SetInternal(r)
	r.SetMatcher(ldap.NewLDAPMatcher())
	return r
}

//
//import (
//	"crypto/tls"
//	"encoding/json"
//	"git.loafle.net/overflow/collector/core/scan/service/matcher/ldap"
//	"git.loafle.net/overflow/collector/core/scan/service/matcher/packet"
//	rpc "git.loafle.net/overflow/of_rpc/json"
//	"git.loafle.net/overflow/of_rpc/models/param"
//	"git.loafle.net/overflow/of_rpc/models/protocol"
//	"log"
//	"net"
//	"strconv"
//)
//
//////////////// Delegate.Get implement /////////////////
//type LDAPProtocol struct{}
//
//func (r *LDAPProtocol) 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)
//
//	rres := &protocol.HealthResponse{IsMatch: match}
//
//	b, err := json.Marshal(&rres)
//	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 := ldap.NewLDAPMatcher()
//
//	for i := 0; i < m.PacketCount(); i++ {
//
//		pack := m.Packet(i)
//		conn.Write(pack.Buffer)
//		bytes := make([]byte, 1024)
//		n, _ := conn.Read(bytes)
//		p := packet.NewPacket(bytes, n)
//
//		if m.IsNoResponse(i) == true { // empty last response
//			break
//		}
//
//		if m.Match(i, p, nil) == false {
//			return false, nil
//		}
//	}
//
//	return true, nil
//}
//
//func start() {
//	rpc.SetDelegate(new(LDAPProtocol))
//	err := rpc.StartJSONRPC()
//	if err != nil {
//		log.Fatal(err)
//	}
//}
//
//func main() {
//	start()
//}
