package rest

import (
	"io"

	"git.ali33.ru/fcg-xvii/go-tools/json"
)

type IRequest interface {
	IsAuth() bool
	Command() string
	Auth() json.Map
	Data() json.Map
	FileKeys() []string
	File(name string) (io.Reader, bool)
	GenerateToken(data json.Map, expire int64) (string, error)
	Root() any
	Core() any
	ResponseSuccess(data json.Map, files map[string]io.ReadCloser) IResponse
	ResponseError(code int, err IErrorArgs) IResponse
}

type Request struct {
	auth          json.Map `json:"auth"`
	command       string   `json:"command"`
	data          json.Map `json:"data"`
	fileKeys      []string `json:"file_keys"`
	files         map[string]io.Reader
	core          any
	root          any
	generateToken func(data json.Map, expire int64) (string, error)
	//Response      func(data json.Map, files map[string]io.ReadCloser) IResponse
}

// сеттеры

func (s *Request) SetAuth(auth json.Map) {
	s.auth = auth
}

func (s *Request) SetCommand(command string) {
	s.command = command
}

func (s *Request) SetData(data json.Map) {
	s.data = data
}

func (s *Request) SetFiles(files map[string]io.Reader) {
	s.files = files
}

func (s *Request) SetRoot(root any) {
	s.root = root
}

func (s *Request) SetCore(core any) {
	s.core = core
}

func (s *Request) SetGenerateToken(generateToken func(data json.Map, expire int64) (string, error)) {
	s.generateToken = generateToken
}

// методы интерфейса

func (s *Request) IsAuth() bool {
	return s.auth != nil
}

func (s *Request) Command() string {
	return s.command
}

func (s *Request) Auth() json.Map {
	return s.auth
}

func (s *Request) Data() json.Map {
	return s.data
}

func (s *Request) FileKeys() []string {
	keys := make([]string, len(s.files))
	for key, _ := range s.files {
		keys[0] = key
	}
	return keys
}

func (s *Request) File(name string) (io.Reader, bool) {
	file, ok := s.files[name]
	return file, ok
}

func (s *Request) GenerateToken(data json.Map, expire int64) (string, error) {
	return s.generateToken(data, expire)
}

func (s *Request) Root() any {
	return s.root
}

func (s *Request) Core() any {
	return s.core
}

func (s *Request) ResponseSuccess(data json.Map, files map[string]io.ReadCloser) IResponse {
	return &Response{
		code:  200,
		data:  data,
		files: files,
	}
}

func (s *Request) ResponseError(code int, err IErrorArgs) IResponse {
	return &Response{
		code: code,
		err:  err,
	}
}