package flashscore

import (
	"bytes"
	"fmt"
	webspider "spider"
	"time"

	"github.com/PuerkitoBio/goquery"
)

func listScheduledHandballMatches() (result []ScheduledMatch, err error) {

	spider, err := webspider.NewSpider(nil)
	if err != nil {
		panic(err)
	}

	// Загружаем AJAX страницу с таблицами матчей
	//url := fmt.Sprintf(h2hTablesURLPattern, matchID)

	buf, err := spider.Get(handballAllGamesFeedURL, map[string]string{
		"referer":          "https://d.flashscore.com/x/feed/proxy-local",
		"x-requested-with": "XMLHttpRequest",
		// Важное поле! Код можно найти в исходниках либо подсмотреть. Без кода
		// сервер отдает 401 ошибку
		"x-fsign":   feedSign,
		"x-referer": "https://www.flashscore.com/handball/",
		"x-geoip":   "1",
	})
	if err != nil {
		err = fmt.Errorf("Load handball All Games feed: %s", err)
		return
	}

	result, err = parseListOfScheduledMatches(string(buf))
	if err != nil {
		err = fmt.Errorf("parseListOfScheduledMatches: %s", err)
		return
	}
	return
}

func Check() (err error) {
	matches, err := listScheduledHandballMatches()
	if err != nil {
		return
	}

	matches = DiscardScheduledMatchesFurtherThan(matches, 24*time.Hour)

	for _, m := range matches {
		report, err := GetUpcomingMatchReport(m.MatchID)
		if err != nil {
			// log
		}
	}
	return
}

func GetUpcomingMatchReport(matchID string) (report HandballUpcomingMatchReport, err error) {
	report.IsComplete = true

	spider, err := webspider.NewSpider(nil)
	if err != nil {
		panic(err)
	}

	// Загружаем Landing
	landingURL := fmt.Sprintf(h2hLandingURLPattern, matchID)

	buf, err := spider.Get(landingURL, nil)
	if err != nil {
		err = fmt.Errorf("load h2hLanding: %s", err)
		return
	}

	doc, err := goquery.NewDocumentFromReader(bytes.NewBuffer(buf))
	if err != nil {
		err = fmt.Errorf("goquery.NewDocumentFromReader: %s", err)
		return
	}

	// FIX - добавить чемпионат и парсинг инфы
	//_, _, report.Home, report.Away, err = s.parseFootballMatchInfo(doc)
	//if err != nil {
	//	return
	//}

	// Загружаем AJAX страницу с таблицами матчей
	url := fmt.Sprintf(h2hTablesURLPattern, matchID)

	buf, err = spider.Get(url, map[string]string{
		"referer":          "https://d.flashscore.com/x/feed/proxy-local",
		"x-requested-with": "XMLHttpRequest",
		// Важное поле! Код можно найти в исходниках либо подсмотреть. Без кода
		// сервер отдает 401 ошибку
		"x-fsign":   feedSign,
		"x-referer": fmt.Sprintf(h2hLandingURLPattern, matchID),
		"x-geoip":   "1",
	})
	if err != nil {
		err = fmt.Errorf("load h2hTables: %s", err)
		return
	}

	doc, err = goquery.NewDocumentFromReader(bytes.NewBuffer(buf))
	if err != nil {
		err = fmt.Errorf("goquery.NewDocumentFromReader: %s", err)
		return
	}
	//	var (dirtyTeamID string

	// OVERALL - последние матчи команд (хозяев и гостей)
	// Внутри блока <div id="tab-h2h-overall" будут 2 таблицы:
	//     <table class="head_to_head h2h_home"
	//     <table class="head_to_head h2h_away"
	//
	// Строки (tr) внутри таблицы имеют вид:
	//      <tr class="odd highlight"
	//      <tr class="even highlight"

	overall := doc.Find("#tab-h2h-overall")
	if overall.Length() == 0 {
		err = fmt.Errorf("Div #tab-h2h-overall not found")
		return
	}

	overall = overall.First()

	// Последние матчи хозяев (во всех турнирах, на выезде и в гостях)
	home := overall.Find(".h2h_home")
	if home.Length() == 0 {
		err = fmt.Errorf("Table .h2h_home not found")
		return
	}

	report.HomeTeamMatches, err = parseMatchesResults(home.First().Find(".highlight"))
	if err != nil {
		return
	}

	// Последние матчи AWAY команды  (во всех турнирах, на выезде и в гостях)
	away := overall.Find(".h2h_away")
	if away.Length() == 0 {
		err = fmt.Errorf("Table .h2h_away not found")
		return
	}

	report.AwayTeamMatches, err = parseMatchesResults(away.First().Find(".highlight"))
	if err != nil {
		return
	}

	// Последние личные встречи (во всех турнирах, на выезде и в гостях)
	h2h := overall.Find(".h2h_mutual")
	if home.Length() == 0 {
		err = fmt.Errorf("Table .h2h_mutual not found")
		return
	}

	report.H2H, err = parseMatchesResults(h2h.First().Find(".highlight"))
	if err != nil {
		return
	}
	/*
		var hasLostMatch bool

			hasLostMatch, report.HomeTeamMatches, err = s.addSummaryToFootballMatches(report.HomeTeamMatches)
			if err != nil {
				return
			}
			if hasLostMatch {
				report.IsComplete = false
			}

			hasLostMatch, report.AwayTeamMatches, err = s.addSummaryToFootballMatches(report.AwayTeamMatches)
			if err != nil {
				return
			}
			if hasLostMatch {
				report.IsComplete = false
			}

			hasLostMatch, report.H2H, err = s.addSummaryToFootballMatches(report.H2H)
			if err != nil {
				return
			}
			if hasLostMatch {
				report.IsComplete = false
			}


	*/

	// load odds +
	report.Odds, err = loadFootballOdds(spider, matchID)
	if err != nil {
		err = fmt.Errorf("loadOdds: %s", err)
		return
	}
	return
}
