package main

import (
	"fmt"
	"html"
	"strings"
	"text/tabwriter"

	tele "gopkg.in/telebot.v3"

	"git.gensokyo.cafe/kkyy/tgbot_misaka_5882f7/hostcmds"
)

func handleDigCmd(c tele.Context) error {
	msg := c.Message()
	if msg == nil {
		return nil
	}

	req, err := hostcmds.NewDigRequest(msg.Payload)
	if err != nil {
		return c.Reply(
			"Invalid arguments.\nUsage: `/dig <name> [type]`",
			&tele.SendOptions{ParseMode: tele.ModeMarkdown},
			tele.Silent,
		)
	}

	resp, err := hostcmds.Dig(req)
	if err != nil {
		_ = c.Reply(stickerFromID(stickerPanic), tele.Silent)
		return err
	}

	replyBuf := &strings.Builder{}
	tw := tabwriter.NewWriter(replyBuf, 0, 0, 2, ' ', 0)
	// Write header
	if len(resp.Records) > 0 {
		_, _ = tw.Write([]byte("Name\tTTL\tType\tData\n"))
	}
	// Write data
	for _, r := range resp.Records {
		_, _ = fmt.Fprintf(tw, "%s\t%d\t%s\t%s\n", r.Name, r.TTL, r.Type, r.Data)
	}
	_ = tw.Flush()

	replyText := []string{
		fmt.Sprintf("<i>Status: <b>%s</b></i>\n", resp.Status),
		fmt.Sprintf("<i>Query Time: <b>%s</b></i>\n\n", resp.QueryTime),
		"<pre>",
		html.EscapeString(replyBuf.String()),
		"</pre>",
	}
	return c.Reply(strings.Join(replyText, ""), &tele.SendOptions{ParseMode: tele.ModeHTML}, tele.Silent)
}