package main

import "samhofi.us/x/keybase/v2/types/chat1"
import "github.com/charmbracelet/bubbles/spinner"
import "github.com/charmbracelet/bubbles/viewport"

type model struct {
	chat                []chat1.MsgSummary
	conversations       []Channels
	feed                []chat1.MsgSummary
	currentConversation chat1.ChatChannel
	viewport            viewport.Model
	spinner             spinner.Model
	ready               bool
	quitting            bool
}

// Command outlines a command
type Command struct {
	Cmd         []string       // Any aliases that trigger this command
	Description string         // A short description of the command
	Help        string         // The full help text explaining how to use the command
	Exec        func([]string) // A function that takes the command (arg[0]) and any arguments (arg[1:]) as input
}

// TypeCommand outlines a command that reacts on message type
type TypeCommand struct {
	Cmd         []string               // Message types that trigger this command
	Name        string                 // The name of this command
	Description string                 // A short description of the command
	Exec        func(chat1.MsgSummary) // A function that takes a raw chat message as input
}

// Config holds user-configurable values
type Config struct {
	filepath   string     `toml:"-"` // filepath is not stored in the config file, but is written to the Config struct so it's known where the config was loaded from
	Basics     Basics     `toml:"basics"`
	Formatting Formatting `toml:"formatting"`
	Colors     Colors     `toml:"colors"`
}

// Basics holds the 'basics' section of the config file
type Basics struct {
	DownloadPath  string `toml:"download_path"`
	Colorless     bool   `toml:"colorless"`
	CmdPrefix     string `toml:"cmd_prefix"`
	UnicodeEmojis bool   `toml:"unicode_emojis"`
}

// Formatting holds the 'formatting' section of the config file
type Formatting struct {
	OutputFormat           string `toml:"output_format"`
	OutputStreamFormat     string `toml:"output_stream_format"`
	OutputMentionFormat    string `toml:"output_mention_format"`
	PMFormat               string `toml:"pm_format"`
	DateFormat             string `toml:"date_format"`
	TimeFormat             string `toml:"time_format"`
	IconFollowingUser      string `toml:"icon_following_user"`
	IconIndirectFollowUser string `toml:"icon_indirect_following_user"`
}

// Colors holds the 'colors' section of the config file
type Colors struct {
	Channels Channels `toml:"channels"`
	Message  Message  `toml:"message"`
	Feed     Feed     `toml:"feed"`
}

// Style holds basic style information
type Style struct {
	Foreground    string `toml:"foreground"`
	Background    string `toml:"background"`
	Italic        bool   `toml:"italic"`
	Bold          bool   `toml:"bold"`
	Underline     bool   `toml:"underline"`
	Strikethrough bool   `toml:"strikethrough"`
	Inverse       bool   `toml:"inverse"`
}

// Channels holds the style information for various elements of a channel
type Channels struct {
	Basic  Style `toml:"basic"`
	Header Style `toml:"header"`
	Unread Style `toml:"unread"`
}

// Message holds the style information for various elements of a message
type Message struct {
	Body          Style `toml:"body"`
	Header        Style `toml:"header"`
	Mention       Style `toml:"mention"`
	ID            Style `toml:"id"`
	Tags          Style `toml:"tags"`
	Time          Style `toml:"time"`
	SenderDefault Style `toml:"sender_default"`
	SenderDevice  Style `toml:"sender_device"`
	SenderTags    Style `toml:"sender_tags"`
	Attachment    Style `toml:"attachment"`
	LinkURL       Style `toml:"link_url"`
	LinkKeybase   Style `toml:"link_keybase"`
	Reaction      Style `toml:"reaction"`
	Quote         Style `toml:"quote"`
	Code          Style `toml:"code"`
}

// Feed holds the style information for various elements of the feed window
type Feed struct {
	Basic   Style `toml:"basic"`
	Error   Style `toml:"error"`
	File    Style `toml:"file"`
	Success Style `toml:"success"`
}