package flag

import (
	"fmt"
)

type Type int

const (
	EOF Type = iota
	Eol
	Keyword
	QuotedString
	Variable
	BlockStart
	BlockEnd
	Semicolon
	Comment
	Illegal
	Regex
)

var (
	FlagName = map[Type]string{
		QuotedString: "QuotedString",
		EOF:          "Eof",
		Keyword:      "Keyword",
		Variable:     "Variable",
		BlockStart:   "BlockStart",
		BlockEnd:     "BlockEnd",
		Semicolon:    "Semicolon",
		Comment:      "Comment",
		Illegal:      "Illegal",
		Regex:        "Regex",
	}
)

func (tt Type) String() string {
	return FlagName[tt]
}

type Flag struct {
	Type    Type
	Literal string
	Line    int
	Column  int
}

func (t Flag) String() string {
	return fmt.Sprintf("{Type:%s,Literal:\"%s\",Line:%d,Column:%d}", t.Type, t.Literal, t.Line, t.Column)
}

func (t Flag) Lit(literal string) Flag {
	t.Literal = literal
	return t
}

func (t Flag) EqualTo(t2 Flag) bool {
	return t.Type == t2.Type && t.Literal == t2.Literal
}

type Flags []Flag

func (fs Flags) EqualTo(flags Flags) bool {
	if len(fs) != len(flags) {
		return false
	}
	for i, t := range fs {
		if !t.EqualTo(flags[i]) {
			return false
		}
	}
	return true
}

func (t Flag) Is(typ Type) bool {
	return t.Type == typ
}

func (t Flag) IsParameterEligible() bool {
	return t.Is(Keyword) || t.Is(QuotedString) || t.Is(Variable) || t.Is(Regex)
}