<?php

/**
 * Copyright 1999-2021 iFLYTEK Corporation

 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

namespace app\extend\IFlytek\Xfyun\Speech\Config;

use app\extend\IFlytek\Xfyun\Core\Traits\ArrayTrait;
use app\extend\IFlytek\Xfyun\Core\Traits\JsonTrait;
use app\extend\IFlytek\Xfyun\Core\Config\ConfigInterface;

/**
 * 语音评测配置参数类
 *
 * @author guizheng@iflytek.com
 */
class IseConfig implements ConfigInterface
{
    use ArrayTrait;
    use JsonTrait;

    /**
     * @var string 服务类型指定
     * ise: 开放评测
     * 默认'ise'
     */
    private $sub;

    /**
     * @var string 评测语种
     * 中文：cn_vip，英文：en_vip
     * 默认'cn_vip'
     */
    private $ent;

    /**
     * @var string 评测题型
     * 中文题型：
     *  read_syllable（单字朗读，汉语专有）
     *  read_word（词语朗读）
     *  read_sentence（句子朗读）
     *  read_chapter(篇章朗读)
     * 英文题型：
     *  read_word（词语朗读）
     *  read_sentence（句子朗读）
     *  read_chapter(篇章朗读)
     *  simple_expression（英文情景反应）
     *  read_choice（英文选择题）
     *  topic（英文自由题）
     *  retell（英文复述题）
     *  picture_talk（英文看图说话）
     *  oral_translation（英文口头翻译）
     * 默认read_sentence
     */
    private $category;

    /**
     * @var int 上传音频时来区分音频的状态
     * 1/2/4
     * 默认1
     */
    private $aus;

    /**
     * @var string 用来区分数据上传阶段
     *  ssb：参数上传阶段
     *  ttp：文本上传阶段（ttp_skip=true时该阶段可以跳过，直接使用text字段中的文本）
     *  auw：音频上传阶段
     * 必传
     */
    private $cmd;

    /**
     * @var string 待评测文本
     * 需要加utf8bom头：'\uFEFF' + text
     */
    private $text;

    /**
     * @var string 带评测文本编码
     * utf-8/gbk
     * 默认utf-8
     */
    private $tte;

    /**
     * @var boolean 跳过ttp直接使用text中的文本进行评测
     * true/false
     * 默认true
     */
    private $ttpSkip;

    /**
     * @var string 拓展能力（生效条件ise_unite="1", rst="entirety"）
     * 多维度分信息显示（准确度分、流畅度分、完整度打分）：extra_ability值为multi_dimension，字词句篇均适用，如选多个能力，用分号；隔开。例如：extra_ability=syll_phone_err_msg;pitch;multi_dimension
     * 单词基频信息显示（基频开始值、结束值）：extra_ability值为pitch ，仅适用于单词和句子题型
     * 音素错误信息显示（声韵、调型是否正确）：extra_ability值为syll_phone_err_msg，字词句篇均适用,如选多个能力，用分号；隔开。例如：extra_ability=syll_phone_err_msg;pitch;multi_dimension
     */
    private $extraAbility;

    /**
     * @var string 音频格式
     * raw: 未压缩的pcm格式音频或wav（如果用wav格式音频，建议去掉头部）
     * lame: mp3格式音频
     * speex-wb;7: 讯飞定制speex格式音频
     * 默认speex-wb
     */
    private $aue;

    /**
     * @var string 音频采样率
     * 默认 audio/L16;rate=16000
     */
    private $auf;

    /**
     * @var string 返回结果格式
     * utf8/gbk
     * 默认utf8
     */
    private $rstcd;

    /**
     * @var string 评测人群指定
     * adult（成人群体，不设置群体参数时默认为成人）
     * youth（中学群体）
     * pupil（小学群体，中文句、篇题型设置此参数值会有accuracy_score得分的返回）
     * 默认adult
     */
    private $group;

    /**
     * @var string 设置评测的打分及检错松严门限（仅中文引擎支持）
     * easy：容易
     * common：普通
     * hard：困难
     */
    private $checkType;

    /**
     * @var string 设置评测的学段参数 （仅中文题型：中小学的句子、篇章题型支持）
     * junior(1,2年级)
     * middle(3,4年级)
     * senior(5,6年级)
     */
    private $grade;

    /**
     * @var string 评测返回结果与分制控制（评测返回结果与分制控制也会受到ise_unite与plev参数的影响）
     * 完整：entirety（默认值）
     *  中文百分制推荐传参（rst="entirety"且ise_unite="1"且配合extra_ability参数使用）
     *  英文百分制推荐传参（rst="entirety"且ise_unite="1"且配合extra_ability参数使用）
     * 精简：plain（评测返回结果将只有总分）
     */
    private $rst;

    /**
     * @var string 返回结果控制
     * 0：不控制（默认值）
     * 1：控制（extra_ability参数将影响全维度等信息的返回）
     */
    private $iseUnite;

    /**
     * @var string 在rst="entirety"（默认值）且ise_unite="0"（默认值）的情况下plev的取值不同对返回结果有影响。
     * plev：0(给出全部信息，汉语包含rec_node_type、perr_msg、fluency_score、phone_score信息的返回；英文包含accuracy_score、serr_msg、 syll_accent、fluency_score、standard_score、pitch信息的返回)
     */
    private $plev;

    public function __construct($config)
    {
        $config += [
            'ent' => 'cn_vip',
            'category' => 'read_sentence',
            'aus' => 1,
            'cmd' => 'ssb',
            'text' => '',
            'tte' => 'utf-8',
            'ttp_skip' => true,
            'extra_ability' => null,
            'aue' => 'raw',
            'rstcd' => 'utf8',
            'group' => 'adult',
            'check_type' => 'common',
            'grade' => 'middle',
            'rst' => 'entirety',
            'ise_unite' => '0',
            'plev' => '0'
        ];

        $this->sub = 'ise';
        $this->ent = $config['ent'];
        $this->category = $config['category'];
        $this->aus = $config['aus'];
        $this->cmd = $config['cmd'];
        $this->text = chr(239) . chr(187) . chr(191) . $config['text'];
        $this->tte = $config['tte'];
        $this->ttpSkip = $config['ttp_skip'];
        $this->extraAbility = $config['extra_ability'];
        $this->aue = $config['aue'];
        $this->rstcd = $config['rstcd'];
        $this->group = $config['group'];
        $this->checkType = $config['check_type'];
        $this->grade = $config['grade'];
        $this->rst = $config['rst'];
        $this->iseUnite = $config['ise_unite'];
        $this->plev = $config['plev'];
    }

    /**
     * 去除null项后返回数组形式
     *
     * @return array
     */
    public function toArray()
    {
        return $this->removeNull([
            'sub' => $this->sub,
            'ent' => $this->ent,
            'category' => $this->category,
            'aus' => $this->aus,
            'cmd' => $this->cmd,
            'text' => $this->text,
            'tte' => $this->tte,
            'ttp_skip' => $this->ttpSkip,
            'extra_ability' => $this->extraAbility,
            'aue' => $this->aue,
            'rstcd' => $this->rstcd,
            'group' => $this->group,
            'check_type' => $this->checkType,
            'grade' => $this->grade,
            'rst' => $this->rst,
            'ise_unite' => $this->iseUnite,
            'plev' => $this->plev
        ]);
    }

    /**
     * 返回toArray的Json格式
     *
     * @return string
     */
    public function toJson()
    {
        return $this->jsonEncode($this->toArray());
    }

    public function setText($text)
    {
        $this->text = chr(239) . chr(187) . chr(191) . $text;
    }
}
