package process_queue

import (
	b64 
	
	

	
	
	
	
	
	
	
	
)

type CreateReport struct {
	Queue *models.Queue
	DB    *gorm.DB
}

// Process creates new report queue
func ( CreateReport) () error {
	// Update cronjob as processing
	.Queue.UpdateStatus(models.StatusProcessing)
	// Check extension
	,  := liman.GetExtension(&models.Extension{
		ID: .Queue.Data["extension_id"].(string),
	})
	if  != nil {
		// Update job as failed
		.Queue.UpdateError(.Error())
		return 
	}
	// Check extension status
	if .Status == "0" {
		// Update job as failed
		.Queue.UpdateError("extension is unavailable")
		return 
	}

	// Get credentials
	 := &models.Credentials{}
	if .RequireKey == "true" {
		,  = liman.GetCredentials(
			&models.User{
				ID: .Queue.Data["user_id"].(string),
			},
			&models.Server{
				ID: .Queue.Data["server_id"].(string),
			},
		)
		// Check errors and username is valid
		if  != nil || len(.Username) < 1 {
			// Update job as failed
			.Queue.UpdateError("you need a key to use this extension")
			return 
		}
	}

	// Encode to b64 and set as form value
	 := make(map[string]string)
	["data"] = b64.StdEncoding.EncodeToString([]byte(.Queue.Data["payload"].(string)))

	// Generate token for user
	,  := user_token.Create(.Queue.Data["user_id"].(string))
	if  != nil {
		// Update job as failed
		.Queue.UpdateError(.Error())
		return 
	}

	// Generate new id for logs
	 := uuid.New()

	// Generate command
	,  := sandbox.GenerateCommand(
		,
		,
		&models.CommandParams{
			TargetFunction: .Queue.Data["target"].(string),
			Locale:         helpers.Env("APP_LANG", "tr"),
			Extension:      .Queue.Data["extension_id"].(string),
			Server:         .Queue.Data["server_id"].(string),
			User:           .Queue.Data["user_id"].(string),
			LogID:          .String(),
			RequestData:    ,
			BaseURL:        "https://127.0.0.1",
			Token:          ,
		},
	)
	if  != nil {
		// Update job as failed
		.Queue.UpdateError(.Error())

		return 
	}

	type  struct {
		 string `json:"message"`
		  int    `json:"status"`
	}

	var  
	 := linux.Execute()

	if  := json.Unmarshal([]byte(), &);  != nil {
		// Update job as failed
		.Queue.UpdateError("error when unmarshalling json, output: " + )
		return 
	}

	if . != 200 {
		// Update job as failed
		.Queue.UpdateError(.)
	} else {
		// Update job as done
		.Queue.UpdateAsDone(strings.TrimSpace(strings.ReplaceAll(., "\"", "")))
	}

	return nil
}