package main

import (
	"Study/src/study/day7Function/HtmlTools"
	"fmt"
	"golang.org/x/net/html"
)

func main() {
	// 定义变量，类型为函数func(n *html.Node, pre func(doc *html.Node, id string) *html.Node, id string)
	// pre 参数规定了必须传入一个函数类型的变量，
	// 有两个参数，doc和id, 返回值类型为 *html.Node
	//var forEachNode func(n *html.Node, pre func(doc *html.Node, id string) *html.Node, id string) *html.Node
	//// 实现此函数
	//forEachNode = func(n *html.Node, pre func(doc *html.Node, id string) *html.Node, id string) *html.Node {
	//	c := n.FirstChild
	//	if pre != nil && pre(n, id) != nil {
	//		fmt.Println(n.Data)
	//		return c
	//	}
	//	for ; c != nil; c = c.NextSibling {
	//		// 递归调用，逐级遍历
	//		forEachNode(c, pre, id)
	//	}
	//	return nil
	//}
	//// 定义需要传入的函数
	//var ElementByID func(doc *html.Node, id string) *html.Node
	//ElementByID = func(doc *html.Node, id string) *html.Node {
	//	if doc == nil {
	//		return nil
	//	} else if doc.Type == html.ElementNode && doc.Data == id {
	//		fmt.Println(doc.Data)
	//		return doc
	//	}
	//	return nil
	//}
	////调用
	//forEachNode(HtmlTools.GetHtmlS(), ElementByID, "a")

	var each func(doc *html.Node) func(id string) *html.Node
	each = func(doc *html.Node) func(id string) *html.Node {
		if doc == nil {
			return func(id string) *html.Node {
				fmt.Println("0")
				if doc.Type == html.ElementNode && doc.Data == id {
					fmt.Print(doc.Data)
					ResultNode = doc
					fmt.Println("ret: id")
					return ResultNode
				}
				return ResultNode
			}
		}

		each(doc.FirstChild)
		each(doc.NextSibling)
		return func(id string) *html.Node {
			fmt.Println("1")
			if doc.Type == html.ElementNode && doc.Data == id {
				fmt.Print("data", doc.Data)
				ResultNode = doc
				fmt.Println("ret: id")
				return ResultNode
			}
			fmt.Println("4")
			return ResultNode
		}
	}
	//each1 := each(HtmlTools.GetHtmlS())
	//each1("a")

	// 手动清除ResultNode的内容
	ResultNode = nil
	ElementByID(HtmlTools.GetHtml(), pre, "a")
}

var ResultNode *html.Node = nil

func ElementByID(doc *html.Node, pre func(n *html.Node, id *string) bool, id string) *html.Node {

	if doc != nil && ResultNode == nil {
		ElementByID(doc.FirstChild, pre, id)
		ElementByID(doc.NextSibling, pre, id)
	} else {
		return nil
	}
	if pre(doc, &id) {
		return nil
	}

	return nil
}
func pre(n *html.Node, id *string) bool {
	if n.Type == html.ElementNode && n.Data == *id {
		fmt.Println(n.Data)
		ResultNode = n
		return true
	}
	return false
}
