package controller

import (
	"bytes"
	"context"
	"encoding/json"
	"github.com/loveuer/nf/nft/log"
	"nf-disk/internal/ndh"
	"nf-disk/internal/tool"
	"strings"
)

type App struct {
	ctx      context.Context
	handlers map[string]ndh.Handler
}

func NewApp() *App {
	return &App{
		handlers: make(map[string]ndh.Handler),
	}
}

func (a *App) Startup(ctx context.Context) {
	a.ctx = ctx
	log.Info("app startup!!!")
	initApi(a)
}

func (a *App) Invoke(path string, req string) (res string) {
	log.Info("app invoke: path = %s, req = %s", path, req)
	handler, ok := a.handlers[path]
	if !ok {
		return `{"err": "handler not found", "status": 404}`
	}

	var buf bytes.Buffer
	ctx := ndh.NewCtx(tool.Timeout(), json.NewDecoder(strings.NewReader(req)), &buf)

	if err := handler(ctx); err != nil {
		return err.Error()
	}

	return buf.String()
}