<?php

namespace Mall\Framework\Core;

use Mall\Framework\Core\ResultWrapper;
use Mall\Framework\SearchClient\Exception;

class SendSms {

    private static $_instance;

    protected $error;

    static public function getInstance()
    {
        $key = md5('sendSms');

        if (!self::$_instance[$key] instanceof self) {
            self::$_instance[$key] = new self;
        }

        return self::$_instance[$key];
    }


    /**
     * 发送短信消息方法
     * 官方文档地址: https://help.aliyun.com/document_detail/55451.html?spm=5176.doc55288.6.556.rZK9dj
     * 业务限流       https://help.aliyun.com/knowledge_detail/57710.html?spm=5176.doc55451.6.583.sHFzrz
     *
     * @param string $mobile 接收短信的手机号
     * @param string $signname  短信签名
     * @param string $templatecode  短信模板编号
     * @param string $templateparam 短信模板替换变量
     * @param string $source        发送短信业务来源
     */
    public function send($mobile, $signname, $templatecode, $templateparam, $source = '')
    {
        $options = Config::getInstance()->get('sms');

        if(empty($options)){
            throw  new \ErrorException('短信配置错误');
        }

        $post = [
            'phonenumbers' => $mobile,
            'signname' => $signname,
            'templatecode' => $templatecode,
            'templateparam' => $templateparam,
        ];
        $result = request($options['api_url'], $post);
        if( $result['httpcode'] == 200 && !empty($result['content'])){
            $resultContent = json_decode($result['content'],true);
            if($resultContent['state']){
                return ResultWrapper::success('发送成功');
            }else{
                return ResultWrapper::fail($resultContent['data'], ErrorCode::$apiNotResult);
            }
        }else{
            if(!empty($result['content'])){
                file_put_contents('/tmp/sendSms.log',date('Y-m-d H:i:s').var_export($result['content'],true).PHP_EOL,FILE_APPEND);
                return ResultWrapper::fail('请求接口失败,错误原因请留意日志', ErrorCode::$apiNotResult);
            }else{
                return ResultWrapper::fail('发送失败,接口未返回消息', ErrorCode::$apiNotResult);
            }
        }
    }

    public function getError()
    {
        return $this->error;
    }
}