package controller

import (
	"io"
	"net/http"

	"github.com/go-chi/chi"
	"github.com/goodrain/rainbond/api/handler"
	httputil "github.com/goodrain/rainbond/util/http"
)

// StorageController handles HTTP requests for StorageClass and PersistentVolume
type StorageController struct{}

// ListStorageClasses returns all StorageClasses with PV counts
func (c *StorageController) ListStorageClasses(w http.ResponseWriter, r *http.Request) {
	list, err := handler.GetStorageHandler().ListStorageClasses()
	if err != nil {
		httputil.ReturnBcodeError(r, w, err)
		return
	}
	httputil.ReturnSuccess(r, w, map[string]interface{}{"list": list, "total": len(list)})
}

// CreateStorageClass creates a StorageClass from YAML body
func (c *StorageController) CreateStorageClass(w http.ResponseWriter, r *http.Request) {
	body, err := io.ReadAll(r.Body)
	if err != nil {
		httputil.ReturnBcodeError(r, w, err)
		return
	}
	sc, err := handler.GetStorageHandler().CreateStorageClass(body)
	if err != nil {
		httputil.ReturnBcodeError(r, w, err)
		return
	}
	httputil.ReturnSuccess(r, w, sc)
}

// DeleteStorageClass deletes a StorageClass by name
func (c *StorageController) DeleteStorageClass(w http.ResponseWriter, r *http.Request) {
	name := chi.URLParam(r, "name")
	if err := handler.GetStorageHandler().DeleteStorageClass(name); err != nil {
		httputil.ReturnBcodeError(r, w, err)
		return
	}
	httputil.ReturnSuccess(r, w, nil)
}

// ListPersistentVolumes returns all PersistentVolumes
func (c *StorageController) ListPersistentVolumes(w http.ResponseWriter, r *http.Request) {
	list, err := handler.GetStorageHandler().ListPersistentVolumes()
	if err != nil {
		httputil.ReturnBcodeError(r, w, err)
		return
	}
	httputil.ReturnSuccess(r, w, map[string]interface{}{"list": list, "total": len(list)})
}

// CreatePersistentVolume creates a PersistentVolume from YAML body
func (c *StorageController) CreatePersistentVolume(w http.ResponseWriter, r *http.Request) {
	body, err := io.ReadAll(r.Body)
	if err != nil {
		httputil.ReturnBcodeError(r, w, err)
		return
	}
	pv, err := handler.GetStorageHandler().CreatePersistentVolume(body)
	if err != nil {
		httputil.ReturnBcodeError(r, w, err)
		return
	}
	httputil.ReturnSuccess(r, w, pv)
}

// DeletePersistentVolume deletes a PersistentVolume by name
func (c *StorageController) DeletePersistentVolume(w http.ResponseWriter, r *http.Request) {
	name := chi.URLParam(r, "name")
	if err := handler.GetStorageHandler().DeletePersistentVolume(name); err != nil {
		httputil.ReturnBcodeError(r, w, err)
		return
	}
	httputil.ReturnSuccess(r, w, nil)
}

// GetStorageController returns a new StorageController
func GetStorageController() *StorageController {
	return &StorageController{}
}