<?php

namespace xmvc\libQueue;

/**
 * 任务结构体
 */
class QueueJob
{
    /** ID */
    public int $id = 0;

    /** 管道名称 */
    public string $tubename = '';

    /** 状态 WAIT, DOING, FAILL */
    public string $status = 'WAIT';

    /** 尝试次数 */
    public int $trylimit = 0;

    /** 是否持久化 */
    public bool $persist = false;

    /** Data */
    public array $data = [];

    /** 访问时间 */
    public int $atime = 0;

    /** 创建时间 */
    public int $ctime = 0;

    /** 更新时间 */
    public int $mtime = 0;

    /** 队列中的Job */
    public mixed $originalJob;

    public function fromArray(array $data): self
    {
        $this->id = $data['id'];
        $this->tubename = $data['tubename'];
        $this->status = $data['status'];
        $this->trylimit = $data['trylimit'];
        $this->persist = $data['persist'] === true || $data['persist'] === 'Y';
        if (is_string($data['data'])) {
            $data['data'] = json_decode($data['data'], true);
        }
        $this->data = $data['data'];
        foreach (['atime', 'ctime', 'mtime'] as $field) {
            if (isset($data[$field]) && $data[$field]) {
                if (!is_numeric($data[$field])) {
                    $data[$field] = strtotime($data[$field]);
                }
                $this->{$field} = $data[$field];
            }
        }
        return $this;
    }

    public function toArray(): array
    {
        $data = [
            'tubename' => $this->tubename,
            'status' => $this->status,
            'persist' => $this->persist ? 'Y' : 'N',
            'trylimit' => $this->trylimit,
            'data' => json_encode($this->data, JSON_UNESCAPED_UNICODE),
            'atime' => date('Y-m-d H:i:s')
        ];
        return $data;
    }
}
