<?php

namespace xmvc\test;

use xmvc\MVC;
use xmvc\Container;
use xmvc\EventManager;
use app\model\ModelXmetaUser;
use app\meta\yiparts\XmetaDepa;
use app\meta\yiparts\XmetaUser;
use xmvc\event\MetaUpdateEvent;
use app\meta\yiparts\XmetaGeneral;
use xmvc\event\listener\MetaListener;
use app\meta\yiparts\XmetaLnkUserDepa;
use app\metaCustom\yiparts\CustomXmetaUser;
use xmvc\event\subscriber\MetaDataSubscriber;
use xmvc\event\subscriber\MetaDataSubscriber2;

/**
 * Meta 无数据测试
 */
class MetaTest
{
    public function xmetaUser()
    {
        // 注册事件
        /*
        XmetaUser::on('onSet', function (array $params) {
            dump($params);
        });
        */
        // 新增
        /*
        $user = new XmetaUser();
        $user->id = null; // 可以不赋值 或给 null, 自增字段默认为 null 使用自增
        $user->username = 'qg';
        $user->password = 'abc123...';
        $user->passTime  = '@CURRENT_TIMESTAMP';
        $user->jobno   = $user->username;
        $user->name   = $user->username;
        $user->email   = $user->username . '@demo.com';
        $user->mobile   = '186' . $user->username;
        $user->createBy   = 1;
        $user->updatedBy   = 1;
        $user->save();
        dd($user->toArray(), '新增结束');
        */
        // 删除
        /*
        $user = XmetaUser::get(3);
        if (!$user) {
            dd('没有找到');
        }
        $user->delete();
        dd('删除结束');
        */
        // 自定义扩展元对象类更新
        /*
        $user = CustomXmetaUser::get(3);
        if (!$user) {
            dd('没有找到');
        }
        $user->password = 'abc123...';
        $user->save();
        dd($user->toArray(), '更新结束');
        */
        // MODEL
        //addListener(MetaUpdateEvent::class, new MetaListener());
        //EventManager::getInstance()->removeListenter(MetaUpdateEvent::class, MetaListener::class);
        //EventManager::getInstance()->setPriorityListenter(MetaUpdateEvent::class, MetaListener::class, 3);
        //EventManager::getInstance()->removeSubscriber(MetaUpdateEvent::class, MetaDataSubscriber2::class);
        //EventManager::getInstance()->setPrioritySubscriber(MetaUpdateEvent::class, MetaDataSubscriber2::class, 10);
        //dd(EventManager::getInstance()->getListeners(MetaUpdateEvent::class));
        $user = ModelXmetaUser::get(3);
        $user->password = 'abc123...';
        echo $user->save() ? 1 : 0;
        dd($user->toArray(), 'MODEL');

        dd();

        $user = XmetaUser::get(2);
        $user->email = 'test@yiparts.cn';
        $user->save();
        //$data['status'] = $user->status;
        //$metaCreateBy = $user->getCreateBy();
        //$data['createBy'] = $metaCreateBy->toArray();
        //$data['createByCfg'] = $metaCreateBy->getXmetaUserCfg()->toArray();
        //$data['createByDBCfg'] = $metaCreateBy->getXmetaUserCfg()->toDBRow();
        //$data['updatedBy'] = $user->getUpdatedBy()->toArray();
        $data['toArray'] = $user->toArray();
        //$data['toDBArray'] = $user->toDBRow();
        $depaList = $user->getXmetaDepaList();
        if ($depaList) {
            /** @var XmetaDepa $item */
            foreach ($depaList as $item) {
                $itemParent = $item->getParent();
                $data['depa'][] = [
                    'data' => $item->toArray(),
                    'parent' => $itemParent ? $itemParent->toArray() : null,
                ];
            }
        }
        $lnkUserDepaList = $user->getXmetaLnkUserDepaList();
        if ($lnkUserDepaList) {
            foreach ($lnkUserDepaList as $key => $item) {
                $data['lnkUserDepa'][$key] = $item->toArray();
            }
        }
        $lnkUserDepaFullData = $user->getXmetaLnkUserDepaFullData();
        if ($lnkUserDepaFullData) {
            foreach ($lnkUserDepaFullData as $i => $items) {
                foreach ($items as $className => $obj) {
                    $data['lnkUserDepaFullData'][][$className] = $obj->toArray();
                }
            }
        }
        return R($data);
    }

    public function xmetaGeneral()
    {
        $object = XmetaGeneral::get(2);
        $root = $object->getRoot();
        if ($root) {
            $data['root'] = $root->toArray();
        } else {
            $data['root'] = '顶级';
        }
        $parent = $object->getParent();
        if ($parent) {
            $data['parent'] = $parent->toArray();
        } else {
            $data['parent'] = '无';
        }
        $parents = $object->getAllParents();
        if ($parents) {
            foreach ($parents as $parent) {
                $data['parents'][] = $parent->toArray();
            }
        } else {
            $data['parents'] = '无';
        }
        $object->getChildrensTree();
        foreach ($object->childrens as $children) {
            $data['childrens'][] = $children->toArray();
            if ($children->childrens) {
                foreach ($children->childrens as $value) {
                    $data['childrens'][$children->caption][] = $value->toArray();
                }
            }
        }
        $childrensList = $object->getChildrensList();
        foreach ($childrensList as $item) {
            $data['childrensList'][] = $item->toArray();
        }
        $data['toArray'] = $object->toArray();
        $data['toDBRow'] = $object->toDBRow();
        return R($data);
    }

    public function xmetaGeneralArray()
    {
        $object1 = new XmetaGeneral();
        $all = $object1->all();
        foreach ($all as $meta) {
            //$data['allValues'][] = $meta->toArray();
        }
        $object2 = new XmetaGeneral();
        $data2 = $object2->filter([
            'id{>}' => 2,
            'id{<}' => 5,
        ]);
        /*
        $data2 = $object2->filter(
            [
                'JOIN' => [
                    'XmetaGeneral(parent)' => ['parent.id' => '@parentId'],
                    'XmetaUser(user)' => ['user.id' => '@parent.id'],
                ],
                'WHERE' => [
                    'AND#12' => [
                        'level' => 2,
                        'isSys' => false,
                    ],
                    'id{<=}' => 5,
                    'parent.id' => '@UPPER(user.id+1)',
                ],
            ]
        );
        */
        foreach ($data2 as $meta) {
            $data['filterValues'][] = $meta->toArray();
        }
        //ddSql($object2->last());
        return R($data);
    }
}
