<?php

namespace app\admin\common;

use support\spark\model\system\AdminOrgOriginal;
use support\spark\model\system\AdminOrgUserOriginal;
use support\spark\model\system\AdminUserOriginal;
use yzh52521\EasyHttp\Http;
use support\spark\model\basicdata\FetchdataLog;

set_time_limit(0);
ini_set('memory_limit', '5000M');

class Original
{
    protected $host = 'http://10.10.20.99:8888';
    protected $tokenUrl = '/dmapi/token/access/wuliaoguanli';
    protected $apiUrl;

    protected $token;

    protected $pageIndex = 1;
    protected $pageSize = 500;

    protected $model;

    protected $selectedKeys = [];

    public function __construct($apiUrl, $model, $isUpdate = false, $selectedKeys = [])
    {
        $response = Http::get($this->host . $this->tokenUrl);
        $this->token = $response->json()->data;
        $this->apiUrl = $apiUrl;
        $this->model = new $model();
        if (!$isUpdate) {
            $this->model->truncate();
        }
        $this->selectedKeys = $selectedKeys;
    }

    public function get()
    {
        $response = Http::withHeaders([
            'token' => $this->token,
            'Content-Type' => 'application/json;charset=utf-8'
        ])->asJson()->post($this->host . $this->apiUrl, [
            'pageIndex' => $this->pageIndex,
            'pageSize' => $this->pageSize
        ]);

        $res = $response->json();

        switch (true) {
            case $this->model instanceof AdminOrgOriginal:
                $fetch_name = '拉取所有组织';
                break;
            case $this->model instanceof AdminUserOriginal:
                $fetch_name = '拉取所有人员';
                break;
            case $this->model instanceof AdminOrgUserOriginal:
                $fetch_name = '拉取人员至组织';
                break;
            default:
                $fetch_name = '未知拉取类型';
        }
        # 记录定时任务日志
        (new FetchdataLog())->insert([
            'fetch_name' => $fetch_name,
            'data_num' => $this->pageSize,
            'return_code' => json_encode($res)['code']??200,
            'pull_time' => date('Y-m-d H:i:s'),
//            'content' => json_encode($res)
            'notes'     => $this->host . $this->apiUrl
        ]);


        unset($response);
        $resArr = json_decode(json_encode($res), true);
        unset($res);
        if ($resArr['code'] !== 0) {
            return false;
        }

        if (!empty($resArr['data'])) {
            if (!empty($this->selectedKeys)) {
                $extractedData = [];
                foreach ($resArr['data'] as $item) {
                    $extractedItem = [];
                    foreach ($this->selectedKeys as $key => $value) {
                        if (isset($item[$key])) {
                            $extractedItem[$value] = $item[$key];
                        } else {
                            $extractedItem[$value] = "";
                        }
                    }
                    $extractedData[] = $extractedItem;
                }
                $this->model->insertOrIgnore($extractedData);
                unset($extractedData);
            } else {
                $this->model->insertOrIgnore($resArr['data']);
                unset($resArr);
            }

            $this->pageIndex++;
            $this->get();
        }

        return true;
    }

    public function getUpdate($updateTime)
    {
        $response = Http::withHeaders([
            'token' => $this->token,
            'Content-Type' => 'application/json;charset=utf-8'
        ])->asJson()->post($this->host . $this->apiUrl, [
            'pageIndex' => 1,
            'pageSize' => 500,
            'updateTime' => $updateTime
        ]);

        $res = $response->json();
        $resArr = json_decode(json_encode($res), true);
        # 记录定时任务日志
        (new FetchdataLog())->insert([
            'fetch_name' => '拉取设备物资',
            'data_num' => $this->pageSize,
            'return_code' => $resArr['code'],
            'pull_time' => date('Y-m-d H:i:s'),
            'content' => json_encode($res)
        ]);

        if ($resArr['code'] !== 0) {
            return false;
        }

        if (!empty($resArr['data'])) {
            if (!empty($this->selectedKeys)) {
                $extractedData = [];
                foreach ($resArr['data'] as $item) {
                    $extractedItem = [];
                    foreach ($this->selectedKeys as $key => $value) {
                        if (isset($item[$key])) {
                            $extractedItem[$value] = $item[$key];
                        }
                    }
                    $extractedData[] = $extractedItem;
                }
                $this->model->insertOrIgnore($extractedData);
            } else {
                $this->model->insertOrIgnore($resArr['data']);
            }
        }

        return true;
    }
}