package parser

import (
	"strconv"

	"github.com/jiro4989/textimg/v3/color"
	"github.com/jiro4989/textimg/v3/token"
)

type ParserFunc struct {
	// pegが生成するTokensと名前が衝突するので別名にする
	Tk token.Tokens
}

func Parse(s string) (token.Tokens, error) {
	p := &Parser{Buffer: s}
	if err := p.Init(); err != nil {
		return nil, err
	}
	if err := p.Parse(); err != nil {
		return nil, err
	}

	p.Execute()
	return p.Tk, nil
}

func (p *ParserFunc) pushResetColor() {
	p.Tk = append(p.Tk, token.NewResetColor())
}

func (p *ParserFunc) pushResetForegroundColor() {
	p.Tk = append(p.Tk, token.NewResetForegroundColor())
}

func (p *ParserFunc) pushResetBackgroundColor() {
	p.Tk = append(p.Tk, token.NewResetBackgroundColor())
}

func (p *ParserFunc) pushReverseColor() {
	p.Tk = append(p.Tk, token.NewReverseColor())
}

func (p *ParserFunc) pushText(text string) {
	p.Tk = append(p.Tk, token.NewText(text))
}

func (p *ParserFunc) pushStandardColorWithCategory(text string) {
	p.Tk = append(p.Tk, token.NewStandardColorWithCategory(text))
}

func (p *ParserFunc) pushExtendedColor(text string) {
	p.Tk = append(p.Tk, token.NewExtendedColor(text))
}

func (p *ParserFunc) setExtendedColor256(text string) {
	n, _ := strconv.ParseUint(text, 10, 8)
	p.Tk[len(p.Tk)-1].Color = color.Map256[int(n)]
}

func (p *ParserFunc) setExtendedColorR(text string) {
	n, _ := strconv.ParseUint(text, 10, 8)
	p.Tk[len(p.Tk)-1].Color.R = uint8(n)
}

func (p *ParserFunc) setExtendedColorG(text string) {
	n, _ := strconv.ParseUint(text, 10, 8)
	p.Tk[len(p.Tk)-1].Color.G = uint8(n)
}

func (p *ParserFunc) setExtendedColorB(text string) {
	n, _ := strconv.ParseUint(text, 10, 8)
	p.Tk[len(p.Tk)-1].Color.B = uint8(n)
}