package handlers

import (
	

	
	
	
	
	
	
	
	
	
)

type QueueHandler struct {
	db *gorm.DB
}

func () *QueueHandler {
	return &QueueHandler{
		db: database.Connection(),
	}
}

// Create creates new queue
func ( *QueueHandler) ( *fiber.Ctx) error {
	var  map[string]string
	 := &models.Queue{}
	if  := .BodyParser(&);  != nil {
		 = helpers.GetFormData()
		if  == nil {
			return 
		}
	}

	if .Type == "" {
		 = &models.Queue{
			Type: models.Operation(["type"]),
			Data: map[string]interface{}{
				"extension_id": ["extension_id"],
				"server_id":    ["server_id"],
				"user_id":      ["user_id"],
				"target":       ["target"],
				"payload":      ["payload"],
			},
		}
	}

	if .Data["server_id"] == nil {
		return .Status(422).JSON(fiber.Map{
			"server_id": "server id is required",
		})
	}

	// Check if user is eligible to use this server
	,  := liman.GetUser(&models.User{ID: .Locals("user_id").(string)})
	if .Status == 0 {
		var  int64
		.db.Model(&models.Permission{}).Find(&models.Permission{
			MorphID: .Locals("user_id").(string),
			Type:    "server",
			Value:   .Data["server_id"].(string),
		}).Count(&)

		if  < 1 {
			return logger.FiberError(fiber.StatusForbidden, "you are not allowed to use this server")
		}
	}

	// Create queue object
	if  := .db.Create().Error;  != nil {
		return 
	}

	// Start processing by type
	var  process_queue.ProcessQueue
	switch .Type {
	case models.OperationInstall:
		 = &process_queue.InstallPackage{
			Queue:  ,
			DB:     .db,
			UserID: .Locals("user_id").(string),
		}
		go .Process()
	case models.OperationReport:
		 = &process_queue.CreateReport{
			Queue: ,
			DB:    .db,
		}

		go .Process()
	}

	return .JSON()
}

// Index lists all queues
func ( *QueueHandler) ( *fiber.Ctx) error {
	,  := uuid.Parse(.FormValue("extension_id"))
	if  != nil {
		return errors.New("invalid extension id")
	}

	,  := uuid.Parse(.FormValue("user_id"))
	if  != nil {
		return errors.New("invalid user id")
	}

	,  := uuid.Parse(.FormValue("server_id"))
	if  != nil {
		return errors.New("invalid server id")
	}

	if .FormValue("queue_type") == "" {
		return errors.New("invalid queue type")
	}

	var  []*models.Queue
	if  := .db.Model(&models.Queue{}).
		Where("type = ?", .FormValue("queue_type")).
		Where("data->>'extension_id' = ?", ).
		Where("data->>'server_id' = ?", ).
		Where("data->>'user_id' = ?", ).Find(&).Error;  != nil {
		return 
	}

	return .JSON()
}

// Delete deletes specified queue
func ( *QueueHandler) ( *fiber.Ctx) error {
	// Parse uuid
	,  := uuid.Parse(.Params("id"))
	if  != nil {
		return 
	}

	,  := uuid.Parse(.FormValue("extension_id"))
	if  != nil {
		return errors.New("invalid extension id")
	}

	,  := uuid.Parse(.FormValue("user_id"))
	if  != nil {
		return errors.New("invalid user id")
	}

	,  := uuid.Parse(.FormValue("server_id"))
	if  != nil {
		return errors.New("invalid server id")
	}

	if .FormValue("queue_type") == "" {
		return errors.New("invalid queue type")
	}

	if  := .db.Model(&models.Queue{}).
		Where("type = ?", .FormValue("queue_type")).
		Where("id = ?", ).
		Where("data->>'extension_id' = ?", ).
		Where("data->>'server_id' = ?", ).
		Where("data->>'user_id' = ?", ).Delete(models.Queue{}).Error;  != nil {
		return 
	}

	return .JSON("Item deleted successfully.")
}