<?php
/**
 * 地区缓存
 * Created by PhpStorm.
 * User: XiaoMing
 * Date: 2019/11/5
 * Time: 14:26
 */

namespace JinDouYun\Cache;

use Mall\Framework\Core\ErrorCode;
use Mall\Framework\Core\ResultWrapper;
use Mall\Framework\Factory;

class SysAreaChinaCache
{
    private $cache;

    protected $allProvince = 'province';//所有省key

    protected $provinceCodeRelationCityKey = 'provinceCodeRelationCity';//省份下的市key

    protected $cityCodeRelationAreaKey = 'cityCodeRelationArea'; //市下的区县key

    protected $codeRelationNameKey = 'codeRelationName';//code=>name的key

    protected $allKey = 'AreaChinaCache';

    protected $notArea = 'notArea';//缓存所有不存在的地区

    public function __construct($cacheDb = 'mapping')
    {
        $this->cache = Factory::cache($cacheDb);
    }

    /**
     * 缓存所有省
     * @param $data
     * @return ResultWrapper
     */
    public function cacheAllProvince($data)
    {
        $result = $this->cache->set($this->allProvince, gzcompress(json_encode($data)));
        if ($result) {
            return ResultWrapper::success('success');
        } else {
            return ResultWrapper::fail('error', ErrorCode::$redisWriteError);
        }
    }

    /**
     * 获取缓存中的所有省
     * @return array|mixed
     */
    public function getAllProvince()
    {
        $result = $this->cache->get($this->allProvince);
        if (!$result) {
            return [];
        }
        return json_decode(gzuncompress($result));
    }

    /**
     * 判断是否有省份的缓存Key
     * @return boolean
     */
    public function isHaveProvinceKey()
    {
        $result = $this->cache->has($this->allProvince);
        return $result;
    }

    /**
     * 缓存对应省份下城市
     * @param $data
     * @param $code
     * @return ResultWrapper
     */
    public function cacheCityByCode($data, $code)
    {
        $result = $this->cache->set($this->provinceCodeRelationCityKey . '::' . $code, gzcompress(json_encode($data)));
        if ($result) {
            return ResultWrapper::success('success');
        } else {
            return ResultWrapper::fail('error', ErrorCode::$redisWriteError);
        }
    }

    /**
     * 通过省份code-->市
     * @param $code
     * @return array|mixed
     */
    public function getCityByProvinceCode($code)
    {
        $result = $this->cache->get($this->provinceCodeRelationCityKey . '::' . $code);
        if (!$result) {
            return [];
        }
        return json_decode(gzuncompress($result));
    }

    /**
     * 判断缓存中是否有此key(城市)
     * @param $code
     * @return mixed
     */
    public function isHaveCityKeyByProvinceCode($code)
    {
        $result = $this->cache->has($this->provinceCodeRelationCityKey . '::' . $code);
        return $result;
    }

    /**
     * 缓存市下的区
     * @param $data
     * @param $code
     * @return ResultWrapper
     */
    public function cacheAreaByCode($data, $code)
    {
        $result = $this->cache->set($this->cityCodeRelationAreaKey . '::' . $code, gzcompress(json_encode($data)));
        if ($result) {
            return ResultWrapper::success('success');
        } else {
            return ResultWrapper::fail('error', ErrorCode::$redisWriteError);
        }
    }


    /**
     * 通过市Code->区
     * @param $code
     * @return array|mixed
     */
    public function getAreaByCityCode($code)
    {
        $result = $this->cache->get($this->cityCodeRelationAreaKey . '::' . $code);
        if (!$result) {
            return [];
        }
        return json_decode(gzuncompress($result));
    }

    /**
     * 判断缓存中是否有此key(区)
     * @param $code
     * @return mixed
     */
    public function isHaveAreaKeyByCityCode($code)
    {
        $result = $this->cache->has($this->cityCodeRelationAreaKey . '::' . $code);
        return $result;
    }

    /**
     * 缓存 name => code
     * @param $name
     * @param $code
     * @return ResultWrapper
     */
    public function cacheCodeRelationName($name, $code)
    {
        $result = $this->cache->zadd($this->codeRelationNameKey, $code, $name);
        if ($result) {
            return ResultWrapper::success('success');
        } else {
            return ResultWrapper::fail('error', ErrorCode::$redisWriteError);
        }
    }

    /**
     * 通过code获取集合中的name
     * @param $code
     * @return string
     */
    public function getNameByCode($code)
    {
        $result = $this->cache->zrangebyscore($this->codeRelationNameKey, $code, $code);
        if (!$result) {
            return '';
        }
        return $result;
    }

    /**
     * 通过name获取code
     * @param $name
     * @return int
     */
    public function getCodeByName($name): int
    {
        $result = $this->cache->zscore($this->codeRelationNameKey, $name);
        if (!$result) return 0;
        return $result;
    }

    /********************************************通过地区名称缓存code******************************************/
    /**
     * 保存
     * @param $key
     * @param $value
     * @return int
     */
    public function setCache($key, $value)
    {
        return $this->cache->hset($this->allKey, $key, $value);
    }

    /**
     * Doc: (des="")
     * User: XMing
     * Date: 2021/1/20
     * Time: 5:25 下午
     */
    public function setNotArea($field,$value = 0)
    {
        return $this->cache->hset($this->notArea, $field, $value);
    }

    /**
     * 获取
     * @param $key
     * @return string
     */
    public function getCache($key)
    {
        $result = $this->cache->hget($this->allKey, $key);
        if(!$result){
            return '';
        }
        return $result;
    }

    /**
     * 删除
     * @param $key
     * @return int
     */
    public function delCache($key){
        return $this->cache->hdel($this->allKey, $key);
    }
}