<?php
// +----------------------------------------------------------------------
// | onezan-admin 快速开发的管理平台
// +----------------------------------------------------------------------
// | 官方网址：https://www.onezan.cn
// +----------------------------------------------------------------------
// | onezan团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: 543885307@qq.com
// +----------------------------------------------------------------------
namespace app\repository\module;

use app\model\ModuleManifest;
use Core\contract\ModuleStoreInterface;


/**
 * Module Manifest Repository
 * @package app\repository\module
 */
class ModuleManifestRepository implements ModuleStoreInterface
{
    protected ModuleManifest $model;

    public function __construct(ModuleManifest $model)
    {
        $this->model = $model;
    }


    /**
     * 获取所有模块清单（可按类型过滤）
     * @param string|null $type 模块类型
     * @return array
     */
    public function getAll(?string $type = null): array
    {
        $query = $this->model->order('sort', 'asc');
        if ($type !== null) {
            $query->where('type', $type);
        }
        return $query->select()->toArray();
    }


    /**
     * 按编码查找模块清单
     * @param string $code 模块编码
     * @return array|null
     */
    public function findByCode(string $code): ?array
    {
        $result = $this->model->where('code', $code)->find();
        return $result ? $result->toArray() : null;
    }


    /**
     * 注册或更新模块清单
     * @param array $data 模块数据
     * @return bool
     */
    public function register(array $data): bool
    {
        $existing = $this->model->where('code', $data['code'])->find();
        if ($existing) {

            unset($data['status'], $data['installed_at']);
            $existing->save($data);
            return true;
        }

        $data['installed_at'] = time();
        return (bool)$this->model->create($data);
    }


    /**
     * 取消注册模块
     * @param string $code
     * @return bool
     */
    public function unregister(string $code): bool
    {
        return $this->model->where('code', $code)->delete() !== false;
    }


    /**
     * 更新模块状态
     * @param string $code   模块标识
     * @param int    $status 状态值
     * @return bool
     */
    public function updateStatus(string $code, int $status): bool
    {
        return $this->model->where('code', $code)->save(['status' => $status]) !== false;
    }
}