<?php
/**
 * Sign.php UTF-8
 * 签到
 *
 * @date    : 2018/5/4 19:33
 *
 * @license 这不是一个自由软件,未经授权不许任何使用和传播。
 * @author  : wuyonghong <wyh@huosdk.com>
 * @version : HUOSDK 8.0
 */

namespace huo\controller\sign;

use huo\controller\common\Base;
use huo\controller\integral\MemIntegral;
use huo\controller\member\MemCache;
use huo\model\sign\MemSignModel;
use huo\model\sign\SignRewordModel;
use huolib\constant\IaConst;
use huolib\constant\MemItgConst;
use huolib\status\SignStatus;
use huolib\tool\Time;
use think\Cache;

class Sign extends Base {
    /**
     * 玩家签到
     *
     * @param int $mem_id 玩家ID
     * @param int $app_id 应用ID
     *
     * @return array
     */
    public function sign($mem_id, $app_id = 0) {
        /* 判断是否已经签到 */
        $_mc_class = MemCache::ins();
        $_me_data = $_mc_class->getMeInfoById($mem_id);
        $_last_sign_time = $_me_data['last_sign_time'];
        $_rs = self::isSignToday($_last_sign_time);
        if (true == $_rs) {
            /* 玩家已签到 */
            $_code = SignStatus::SIGN_HAS_SIGN;

            return $this->huoError($_code, SignStatus::getMsg($_code));
        }
        list($_sign_days, $_last_sign_time) = self::getSignDaysAndTime(
            $_me_data['sign_days'], $_me_data['last_sign_time']
        );
        $_me_data['sign_days'] = $_sign_days + 1;
        $_me_data['last_sign_time'] = time();
        $_rs = $_mc_class->updateMeCache($mem_id, $_me_data);
        if (false == $_rs) {
            $_code = SignStatus::UNKNOWN_ERROR;

            return $this->huoError($_code, SignStatus::getMsg($_code));
        }
        /* 签到完后 更新签到表 */
        $_sign_days = $_me_data['sign_days'];
        $_integral = $this->getReword($_sign_days);
        $_sign_id = $this->insertSignLog($mem_id, $_sign_days, $_integral);
        if (false == $_sign_id) {
            $_code = SignStatus::INNER_ERROR;

            return $this->huoError($_code, SignStatus::getMsg($_code));
        }
        $_rs = (new MemIntegral())->addMemItg(
            $mem_id,
            $_integral,
            IaConst::IA_SIGN,
            $app_id,
            'mem_sign',
            $_sign_id,
            '',
            $app_id
        );
        if (SignStatus::NO_ERROR != $_rs) {
            $_code = $_rs;

            return $this->huoError($_code, SignStatus::getMsg($_rs));
        }
        /* 更新签到时间 */
        $_code = SignStatus::NO_ERROR;
        $_rdata['my_integral'] = $_me_data['my_integral'] + $_integral;
        $_rdata['gain_integral'] = $_integral;
        $_rdata['sign_days'] = $_sign_days;

        return $this->huoSuccess($_code, SignStatus::getMsg($_code), $_rdata);
    }

    /**
     *
     * @param int   $mem_id
     * @param int   $sign_days
     * @param float $integral
     *
     * @return bool|int|string
     */
    public function insertSignLog($mem_id, $sign_days, $integral) {
        $_sign_log['mem_id'] = $mem_id;
        $_sign_log['sign_days'] = $sign_days;
        $_sign_log['integral'] = $integral;

        return (new MemSignModel())->insertLog($_sign_log, true);
    }

    /**
     * 获取积分数量
     *
     * @param int $sign_days
     *
     * @return int
     */
    public function getReword($sign_days = 0) {
        $_sc_data = $this->getSignConf();
        if (empty($sign_days)) {
            return 0;
        }

        return $_sc_data[$sign_days]['integral'];
    }

    /**
     * 获取签到周期开始时间与结束时间
     */
    public static function getStartEnd() {
        return Time::week();
    }

    /**
     * 获取签到天数与签到时间
     *
     * @param $sign_days
     * @param $last_sign_time
     *
     * @return array  sign_day last_sign_time
     */
    public static function getSignDaysAndTime($sign_days, $last_sign_time) {
        $_sign_days = $sign_days;
        $_last_sign_time = $last_sign_time;
        $_rs = self::isSignToday($last_sign_time);
        if (false == $_rs) {
            /* 今日未签到 */
            list($_start_time, $_end_time) = self::getStartEnd();
            if ($last_sign_time < $_start_time) {
                $_sign_days = 0;
                $_last_sign_time = 0;
            } elseif ($last_sign_time > $_start_time && $last_sign_time < $_end_time) {
                /* 周期内 */
                if ($_sign_days > MemItgConst::SIGN_DAY_CIRCLE) {
                    $_sign_days %= MemItgConst::SIGN_DAY_CIRCLE;
                }
            }
        }

        return [$_sign_days, $_last_sign_time];
    }

    /**
     * 今日是否已经签到
     *
     * @param int $last_sign_time 判断今日是否已经签到
     *
     * @return bool
     */
    public static function isSignToday($last_sign_time = 0) {
        list($_start_time, $_end_time) = Time::today();
        if ($last_sign_time >= $_start_time && $last_sign_time < $_end_time) {
            return true;
        }

        return false;
    }

    /**
     *获取签到配置KEY
     *
     * @return string
     */
    public function getSignConfKey() {
        return 'sign_conf';
    }

    /**
     * @return array|bool
     */
    public function getSignConf() {
        $_key = $this->getSignConfKey();
        $_sc_data_json = Cache::get($_key);
        $_sc_data = json_decode($_sc_data_json, true);
        if (!is_array($_sc_data)) {
            $_sc_data = $_sc_data_json;
        }
        if (!is_array($_sc_data) || empty($_sc_data)) {
            $_sc_data = (new SignRewordModel())->getConf();
            if (empty($_sc_data)) {
                return false;
            }
            $this->saveSignConf($_sc_data);
        }

        return $_sc_data;
    }

    /**
     * 保存玩家cache 数据
     *
     * @param     $sc_data
     * @param int $ttl
     */
    public function saveSignConf($sc_data, $ttl = 3600) {
        $_key = $this->getSignConfKey();
        Cache::set($_key, json_encode($sc_data), $ttl);
    }

    /**
     * 更新帐号信息
     *
     * @param $sc_id
     * @param $sc_data
     *
     * @return bool
     */
    public function updateSignConf($sc_id, $sc_data) {
        $_key = $this->getSignConfKey();
        Cache::rm($_key);

        return (new SignRewordModel())->updateConf($sc_data, $sc_id);
    }
}