package controllers

import (
	"fmt"

	oclib "cloud.o-forge.io/core/oc-lib"
	beego "github.com/beego/beego/v2/server/web"
)

// Operations about resource
type ResourceController struct {
	beego.Controller
}

// @Title GetAll
// @Description find resource by id
// @Param	is_draft		query 	string	false		"draft wished"
// @Success 200 {resource} models.resource
// @router / [get]
func (o *ResourceController) GetAll() {
	user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
	results := map[string]interface{}{}
	isDraft := o.Ctx.Input.Query("is_draft")
	for _, resource := range []oclib.LibDataEnum{
		data_collection, comp_collection, storage_collection,
		processing_collection, workflow_collection} {
		d := oclib.NewRequest(resource, user, peerID, groups, nil).LoadAll(isDraft == "true")
		if d.Code != 200 || len(d.Data) == 0 {
			results[resource.String()] = []interface{}{}
		} else {
			results[resource.String()] = d.Data
		}
	}
	o.Data["json"] = map[string]interface{}{"data": results, "code": 200, "error": ""}
	o.ServeJSON()
}

// @Title Get
// @Description find resource by key word
// @Param	search		path 	string	true		"the search you want to get"
// @Param	is_draft		query 	string	false		"draft wished"
// @Success 200 {resource} models.resource
// @router /search/:search [get]
func (o *ResourceController) Search() {
	user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
	search := o.Ctx.Input.Param(":search")
	isDraft := o.Ctx.Input.Query("is_draft")
	results := map[string]interface{}{}
	for _, resource := range []oclib.LibDataEnum{
		data_collection, comp_collection, storage_collection,
		processing_collection, workflow_collection} {
		fmt.Println("search", search)
		d := oclib.NewRequest(resource, user, peerID, groups, nil).Search(nil, search, isDraft == "true")
		if d.Code != 200 || len(d.Data) == 0 {
			results[resource.String()] = []interface{}{}
		} else {
			results[resource.String()] = d.Data
		}
	}
	o.Data["json"] = map[string]interface{}{"data": results, "code": 200, "error": ""}
	o.ServeJSON()
}

// @Title Get
// @Description find resource by id
// @Param	id		path 	string	true		"the id you want to get"
// @Success 200 {resource} models.resource
// @router /:id [get]
func (o *ResourceController) Get() {
	user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
	id := o.Ctx.Input.Param(":id")
	results := map[string]interface{}{}
	for _, resource := range []oclib.LibDataEnum{
		data_collection, comp_collection, storage_collection,
		processing_collection, workflow_collection} {
		d := oclib.NewRequest(resource, user, peerID, groups, nil).LoadOne(id)
		if d.Code != 200 {
			results[resource.String()] = nil
		} else {
			results[resource.String()] = d.Data
		}
	}
	o.Data["json"] = map[string]interface{}{"data": results, "code": 200, "error": ""}
	o.ServeJSON()
}

// @Title Delete
// @Description delete the resource
// @Param	id		path 	string	true		"The id you want to delete"DeleteOne
// @Success 200 {resource} delete success!
// @router /:id [delete]
func (o *ResourceController) Delete() {
	user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
	id := o.Ctx.Input.Param(":id")
	results := map[string]interface{}{}
	for _, resource := range []oclib.LibDataEnum{
		data_collection, comp_collection, storage_collection,
		processing_collection, workflow_collection,
	} {
		d := oclib.NewRequest(resource, user, peerID, groups, nil).DeleteOne(id)
		if d.Code != 200 {
			results[resource.String()] = nil
		} else {
			results[resource.String()] = d.Data
		}
	}
	o.Data["json"] = map[string]interface{}{"data": results, "code": 200, "error": ""}
	o.ServeJSON()
}