package bot

import (
	"errors"
	"fmt"
	"time"

	"github.com/go-rod/rod"
	"github.com/go-rod/rod/lib/proto"
)

type Select struct {
	Element  *rod.Element
	Selector string
}

func (elemSelector *Select) SelectItem(changeValue string) error {
	_, err := elemSelector.Element.Evaluate(rod.Eval(`()=>{document.querySelector("` + elemSelector.Selector + `").value = "` + changeValue + `";}`))
	_, err = elemSelector.Element.Evaluate(rod.Eval(`()=>{document.querySelector("` + elemSelector.Selector + `").dispatchEvent(new Event('change'));}`))
	return err

}
func WaitLoad(frm *rod.Page) error { // belli bir süre redirect ten önceki js fonksiyonunun tamamlanması bekleniyor
	wait := frm.WaitRequestIdle(100*time.Millisecond, nil, nil, nil)
	wait()
	err := frm.WaitLoad()
	return err
}
func ReceiveDOMMessages(page *rod.Page, selector string, searchValue string) (string, error) {
	// Tek bir öğe alınması, hata durumunu kontrol etmek için
	elemd := page.MustElements(selector)

	// Eğer elem boş ise, yani nil ise, hata döndür
	if len(elemd) == 0 {
		err := fmt.Errorf("Sellector Bulunamadı: %v", selector)
		return "", err
	}
	elem := page.MustElement(selector)
	// Eğer elem boş ise, yani nil ise, hata döndür
	if elem == nil {
		err := fmt.Errorf("Sellector Bulunamadı: %v", selector)
		return "", err
	}

	// Öğenin metnini al
	//text := elem.MustEval(fmt.Sprintf(`() => this.%s`, searchValue)).String()
	//	text := elem.MustEval(`() => this.innerText`).String()
	text := elem.MustEval(fmt.Sprintf(`() => this.%s`, searchValue)).String()

	return text, nil
}
func FillInput(frm *rod.Page, selector string, value string) error {
	el, err := frm.Element(selector)
	if err != nil {
		return err
	}

	err = el.Input(value)

	return err

}
func ClickItem(frm *rod.Page, selector string, clickCount int) error {
	// Sayfadan ilgili öğeyi bul
	el, err := frm.Element(selector)
	err = el.WaitLoad()
	if err != nil {
		return err
	}
	err = el.Click(proto.InputMouseButtonLeft, clickCount)
	return err
}
func Wait(frm *rod.Page, millisecond time.Duration) {
	wait := frm.WaitRequestIdle(millisecond*time.Millisecond, nil, nil, nil)
	wait()

}
func CloseBrowser(browser *rod.Browser) {
	browser.Close()
}
func (l *Luca) GetPageByUrl(url string) (*rod.Page, error) {
	allPages, err := l.Page.Browser().Pages()
	if err != nil {
		return nil, err
	}

	return allPages.FindByURL("https://auygs.luca.com.tr/Luca/luca.do")
}
func (l *Luca) GetFrame(page *rod.Page, selector string) (*rod.Page, error) {
	err := page.WaitLoad()
	if err != nil {
		return nil, err
	}
	frm, err := page.Element(selector)
	if err != nil {
		return nil, err
	}
	frame, err := frm.Frame()
	return frame, nil
}

func WaitDomElement(page *rod.Page, selector string, duration time.Duration) error {
	if page == nil {
		return errors.New("page is nil sellector : " + selector)
	}
	//todo: [hd] : timeout taki 10 integer değerini const olarak al ve bunu bastır
	element, err := page.Timeout(duration * time.Second).Element(selector)
	if err != nil {
		return err
	}
	err = element.WaitLoad()
	return err
}

func ReceiveDOMMessagesElements(page *rod.Page, selector string, searchValue string, duration time.Duration) (rod.Elements, error) {
	//todo
	// Tek bir öğe alınması, hata durumunu kontrol etmek için
	elemd, err := page.Timeout(duration * time.Second).Elements(selector)
	if err != nil {
		return nil, err
	}
	// Eğer elem boş ise, yani nil ise, hata döndür
	if len(elemd) == 0 {
		err := fmt.Errorf("Sellector Bulunamadı: %v", selector)
		return nil, err
	}

	return elemd, nil
}

// func (elemSelector *Select) MultipleEvalute(changeValue []string) error {
// 	for i := 0; i < len(changeValue); i++ {
// 		_, err := elemSelector.Element.Evaluate(rod.Eval(changeValue[i]))
// 		if err != nil {
// 			return err
// 		}
// 	}
// 	return nil

// }
