package resource

import (
	"net/http"
)

type OneResource struct {
	Path  string
	Ctype string
	Bytes []byte
}

type Resource struct {
	list map[string]OneResource
}

func New() *Resource {
	r := Resource{}
	r.list = map[string]OneResource{}
	return &r
}

func (this *Resource) Add(path string, ctype string, bytes []byte) {
	// Do not add if already in resources list
	if _, ok := this.list[path]; ok == true {
		return
	}

	// Add to resources list
	this.list[path] = OneResource{
		Path:  path,
		Ctype: ctype,
		Bytes: bytes,
	}
}

func (this *Resource) Response(w http.ResponseWriter, r *http.Request, before func(w http.ResponseWriter, r *http.Request, i *OneResource), after func(w http.ResponseWriter, r *http.Request, i *OneResource)) bool {
	// Do not process if this is not necessary
	if len(r.URL.Path) <= 1 {
		return false
	}

	// Check for resource
	res, ok := this.list[r.URL.Path[1:]]
	if ok == false {
		return false
	}

	// Call `before` callback
	if before != nil {
		before(w, r, &res)
	}

	// Send resource
	w.Header().Set("Content-Type", res.Ctype)
	w.Write(res.Bytes)

	// Call `after` callback
	if after != nil {
		after(w, r, &res)
	}

	return true
}