<?php

namespace App\Jobs\Queue;

use App\Events\Broadcast;
use App\Jobs\Job;
use App\Models\Queue;

class Manage extends Job
{
    protected Queue $worker;

    protected string $action;

    protected string $successStatus;

    protected string $failStatus;

    protected string $failMessage;

    public function __construct(
        Queue $worker,
        string $action,
        string $successStatus,
        string $failStatus,
        string $failMessage,
    ) {
        $this->worker = $worker;
        $this->action = $action;
        $this->successStatus = $successStatus;
        $this->failStatus = $failStatus;
        $this->failMessage = $failMessage;
    }

    public function handle(): void
    {
        switch ($this->action) {
            case 'start':
                $this->worker->server->processManager()->handler()->start($this->worker->id, $this->worker->site_id);
                break;
            case 'stop':
                $this->worker->server->processManager()->handler()->stop($this->worker->id, $this->worker->site_id);
                break;
            case 'restart':
                $this->worker->server->processManager()->handler()->restart($this->worker->id, $this->worker->site_id);
                break;
        }
        $this->worker->status = $this->successStatus;
        $this->worker->save();
        event(
            new Broadcast('manage-queue-finished', [
                'queue' => $this->worker,
            ])
        );
    }

    public function failed(): void
    {
        $this->worker->status = $this->failStatus;
        $this->worker->save();
        event(
            new Broadcast('manage-queue-failed', [
                'message' => $this->failMessage,
                'queue' => $this->worker,
            ])
        );
    }
}