package main

import (
	"fmt"
	"os"
	"path/filepath"
	"sort"
)

/* Pair type */
type Pair struct {
	key   string
	value int
}

/* Pair Slice type */
type PairSlice []Pair

/* Functions used for sort */
func (s PairSlice) Len() int {
	return len(s)
}

func (s PairSlice) Swap(i, j int) {
	s[i], s[j] = s[j], s[i]
}

func (s PairSlice) Less(i, j int) bool {
	if s[i].value == s[j].value {
		return s[i].key < s[j].key
	}
	return s[i].value > s[j].value
}

func main() {
	const path = "../testdata"
	dataDir, err := os.ReadDir(path) // get directory info
	if err != nil {
		fmt.Println("Directory not found!")
		return
	}

	dict := make(map[string]int) // store count in map
	for _, file := range dataDir {
		if file.IsDir() {
			continue
		}
		text, _ := os.ReadFile(filepath.Join(path, file.Name())) // read file content
		word := ""
		for i := range text {
			if text[i] >= 'A' && text[i] <= 'Z' {
				text[i] += 'a' - 'A' // to lower case
			}
			if text[i] >= 'a' && text[i] <= 'z' || word != "" && text[i] == '\'' {
				word += string(text[i]) // extend word
			} else if word != "" {
				dict[word]++ // update map
				word = ""
			}
		}
		if word != "" {
			dict[word]++ // update map
		}
	}

	answer := make(PairSlice, 0)
	for word, cnt := range dict {
		answer = append(answer, Pair{word, cnt}) // get answer from map
	}
	sort.Sort(answer)
	for _, pair := range answer {
		fmt.Printf("%s\t%d\n", pair.key, pair.value)
	}
}
