<?php

namespace App\Http\Controllers;

use App\Models\Job;
use App\Models\Tasks;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Ramsey\Uuid\Uuid;

class TasksController extends GenericController
{
    protected $layout = "layouts.main";
    protected $data = array();
    public $module = 'tasks';
    static $per_page = '10';

    public function __construct()
    {
        $this->model = new Tasks();
        parent::__construct();
    }

    public function index(Request $request)
    {
        return redirect('/manage/tasks/UpdateStoresCashback');
    }

    public function show(Request $request, $task)
    {
        $this->grab($request);
        if ($this->access['is_view'] == 0)
            return redirect('dashboard')->with('message', __('core.note_restric'))->with('status', 'error');

        $tasks = Tasks::where('task', $task)->orderBy('run_at')->get();
        return view('manage.tasks.index', array_merge($this->data, [
            'tasks' => $tasks,
            'task' => $task
        ]));
    }

    public function create(Request $request, $id = 0)
    {
        if ($this->access['is_edit'] == 0)
            return redirect('dashboard')->with('message', __('core.note_restric'))->with('status', 'error');
        return view("manage.tasks.forms.{$request->task}", ['row' => (new Tasks())->toArray(), 'task' => $request->task]);
    }

    public function store(Request $request)
    {
        if ($this->access['is_edit'] == 0)
            return redirect('dashboard')->with('message', __('core.note_restric'))->with('status', 'error');
        $runAt = Carbon::createFromFormat('Y-m-d H:i:s', $request->run_at, 'Africa/Cairo');
        $diffInMinutes = max(now()->diffInMinutes($runAt->timezone('Africa/Cairo'), false), 0);
        $task = new Tasks();
        $task->task = $request->task;
        $task->run_at = $request->run_at;
        $task->data = $request->data;
        $task->job_id = Uuid::uuid4();
        $task->save();
        $taskNamespace = 'App\Jobs\Tasks\\' . $request->task;
        $taskNamespace::dispatch($request->data, $task->job_id)->onQueue('admin')->delay(now()->addMinutes($diffInMinutes + 1));
        return redirect()->to("/manage/tasks/{$request->task}");
    }

    public function delete(Request $request, $jobID)
    {
        if ($this->access['is_remove'] == 0)
            return redirect('dashboard')->with('message', __('core.note_restric'))->with('status', 'error');

        $task = Tasks::where('job_id', $jobID)->first();
        if ($task) {
            $task->delete();
            Job::where('payload', 'like', "%{$jobID}%")->delete();
        }
        return redirect()->to("/manage/tasks/{$request->task}");
    }
}
