package de.vier_bier.habpanelviewer.command;

import android.content.Context;
import android.speech.tts.TextToSpeech;

import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TtsHandler implements ICommandHandler {
    private final Pattern TTS_PATTERN = Pattern.compile("TTS_(SPEAK|SET_LANG) (.*)");

    private final Context mContext;

    private TextToSpeech mTTS;
    private int mStatus;

    public TtsHandler(Context ctx) {
        mContext = ctx;
    }

    @Override
    public boolean handleCommand(Command cmd) {
        final String cmdStr = cmd.getCommand();

        Matcher m = TTS_PATTERN.matcher(cmdStr);
        if (m.matches()) {
            cmd.start();

            final String ttsCmd = m.group(1);
            final String arg = m.group(2);

            if (mTTS == null) {
                mTTS = new TextToSpeech(mContext, i -> {
                    mStatus = i;

                    doHandleCommand(ttsCmd, arg, cmd);
                });
            } else {
                doHandleCommand(ttsCmd, arg, cmd);
            }
        }

        return m.matches();
    }

    private void doHandleCommand(String ttsCmd, String arg, Command cmd) {
        if (mStatus == TextToSpeech.SUCCESS) {
            if ("SPEAK".equalsIgnoreCase(ttsCmd)) {
                mTTS.speak(arg, TextToSpeech.QUEUE_ADD, null);
            } else {
                Locale l = new Locale(arg);

                if (mTTS.isLanguageAvailable(l) >= TextToSpeech.LANG_AVAILABLE) {
                    mTTS.setLanguage(l);
                } else {
                    cmd.failed("Given locale invalid: " + arg);
                }
            }
            cmd.finished();
        } else {
            cmd.failed("Could not initialize TTS engine!");
        }
    }
}