package main

import (
	"fmt"
	"io"
	"sort"
)

type Ranker interface {
	Ranking() []string
}

type testWriter struct{}

func (p testWriter) Write(bs []byte) (int, error) {
	if len(bs) == 0 {
		return 0, nil
	}
	for i := 0; i < len(bs); i++ {
		fmt.Print(string(bs[i]))
	}
	return len(bs), nil
}

func RankPrinter(ranker Ranker, writer io.Writer) {
	rankSize := len(ranker.Ranking())
	for i, teams := range ranker.Ranking() {
		writer.Write([]byte(teams))
		if i != rankSize-1 {
			writer.Write([]byte("\n"))
		}
	}
}

type Team struct {
	Name    string
	Players []string
}

type League struct {
	name  string
	Teams map[string]Team
	Wins  map[string]int
}

func (l *League) MatchResult(firstTeam string, firstScore int, secondTeam string, secondScore int) {
	if _, ok := l.Teams[firstTeam]; ok {
		return
	}
	if _, ok := l.Teams[secondTeam]; ok {
		return
	}
	if firstScore == secondScore {
		return
	}
	if firstScore > secondScore {
		l.Wins[firstTeam]++
	} else if secondScore > firstScore {
		l.Wins[secondTeam]++
	}
}

func (l League) Ranking() []string {
	teamRanking := make([]string, 0, len(l.Wins))
	for winsK := range l.Wins {
		teamRanking = append(teamRanking, winsK)
	}
	sort.Slice(teamRanking, func(i, j int) bool {
		return l.Wins[teamRanking[i]] < l.Wins[teamRanking[j]]
	})
	return teamRanking
}

func main() {
	league := League{"newLeague", map[string]Team{}, map[string]int{"first": 1, "second": 2, "third": 6, "fourth": 3, "fifth": 4}}
	league.MatchResult("third", 5, "second", 4)
	fmt.Println(league)
	fmt.Println(league.Ranking())
	writer := testWriter{}
	RankPrinter(league, writer)
}
