package database

import (
	"net/http"

	"github.com/aerogo/aero"
	"github.com/aerogo/mirror"
	"github.com/animenotifier/arn"
)

// QueryResponse ..
type QueryResponse struct {
	Results []interface{} `json:"results"`
}

// Select ...
func Select(ctx *aero.Context) string {
	dataTypeName := ctx.Get("data-type")
	field := ctx.Get("field")
	searchValue := ctx.Get("field-value")

	// Empty values
	if dataTypeName == "+" {
		dataTypeName = ""
	}

	if field == "+" {
		field = ""
	}

	if searchValue == "+" {
		searchValue = ""
	}

	// Check empty parameters
	if dataTypeName == "" || field == "" {
		return ctx.Error(http.StatusBadRequest, "Not enough parameters", nil)
	}

	// Check data type parameter
	_, found := arn.DB.Types()[dataTypeName]

	if !found {
		return ctx.Error(http.StatusBadRequest, "Invalid type", nil)
	}

	response := &QueryResponse{
		Results: []interface{}{},
	}

	stream := arn.DB.All(dataTypeName)

	process := func(obj interface{}) {
		_, _, value, _ := mirror.GetField(obj, field)

		if value.String() == searchValue {
			response.Results = append(response.Results, obj)
		}
	}

	for obj := range stream {
		process(obj)
	}

	for _, obj := range response.Results {
		mirror.GetField(obj, field)
	}

	return ctx.JSON(response)
}