package main

import (
	"encoding/json"
	"fmt"
	"os"
	"path/filepath"

	"github.com/chzyer/readline"
	"github.com/fr3fou/polo/polo"
)

type DM struct {
	Messages []Message `json:"messages"`
}

type Message struct {
	Content string `json:"content"`
	Type    string `json:"type"`
}

func main() {
	if len(os.Args) < 2 {
		panic("not enough args, provide path to fb inbox dir")
	}
	dir := os.Args[1]
	sentences := []string{}

	err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}

		if info.IsDir() {
			return nil
		}

		f, err := os.Open(path)
		if err != nil {
			return err
		}

		var d DM
		if err := json.NewDecoder(f).Decode(&d); err != nil {
			return err
		}

		for _, m := range d.Messages {
			if m.Type != "Generic" {
				continue
			}

			sentences = append(sentences, m.Content)
		}

		return f.Close()
	})
	if err != nil {
		panic(err)
	}

	chain := polo.NewFromText(1, sentences)
	fmt.Println("Press enter for the next generated message")
	fmt.Println("	You can also enter a starting word")
	fmt.Println("	Type 'quit' to quit")
	rl, err := readline.New("> ")
	if err != nil {
		panic(err)
	}
	defer rl.Close()
	in := ""
	for {
		in, err = rl.ReadlineWithDefault(in)
		if err != nil {
			fmt.Println(err)
			return
		}
		if in == "quit" {
			return
		}
		fmt.Print("< ")
		if in == "" {
			fmt.Println(chain.NextUntilEnd(chain.RandomState()))
		} else {
			fmt.Println(chain.NextUntilEnd(in))
		}
	}
}