package lxrod

import "github.com/go-rod/rod"

// RaceVisibleElement 创建用于使用 css 选择器查询可见元素的 race 分支。
func RaceVisibleElement(r *rod.RaceContext, selector string) *rod.RaceContext {
	return r.ElementFunc(VisibleElement(selector))
}

// RaceVisibleElementX 创建用于使用 xPath 查询可见元素的 race 分支。
func RaceVisibleElementX(r *rod.RaceContext, xPath string) *rod.RaceContext {
	return r.ElementFunc(VisibleElementX(xPath))
}

// VisibleElement 是用于 [rod.RaceContext.ElementFunc] 的函数，用于使用 css 选择器查找可见元素。
func VisibleElement(selector string) func(*rod.Page) (*rod.Element, error) {
	return func(p *rod.Page) (*rod.Element, error) {
		e, err := p.Element(selector)
		if err != nil {
			return nil, err
		}
		ok, err := e.Visible()
		if err != nil {
			return nil, err
		}
		if !ok {
			return nil, &rod.ElementNotFoundError{}
		}
		return e, nil
	}
}

// VisibleElementX 是用于 [rod.RaceContext.ElementFunc] 的函数，用于使用 xPath 查找可见元素。
func VisibleElementX(xPath string) func(*rod.Page) (*rod.Element, error) {
	return func(p *rod.Page) (*rod.Element, error) {
		e, err := p.ElementX(xPath)
		if err != nil {
			return nil, err
		}
		ok, err := e.Visible()
		if err != nil {
			return nil, err
		}
		if !ok {
			return nil, &rod.ElementNotFoundError{}
		}
		return e, nil
	}
}
