package com.diampark.test.Fragment;

import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.diampark.test.Class.AudioRecordUtil;
import com.diampark.test.Class.MyFileManager;
import com.diampark.test.Class.SuiviConcentration;
import com.diampark.test.Class.UserPhonationSession;
import com.diampark.test.Interface.StateDialogInterface;
import com.diampark.test.MainActivity;
import com.diampark.test.R;
import com.google.gson.Gson;
import com.google.gson.JsonObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Calendar;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

public class PhonationFragment extends BottomNavigationFragment implements StateDialogInterface {

    protected String modalite;
    private TextView say;
    private Button start;
    private UserPhonationSession userPhoneSession;
    private MainActivity mActivity;
    private int ifPressed = 0;
    private Context myContext;
    private String outPut;
    private ProgressBar progressBar;

    public PhonationFragment() {
        super(R.layout.fragment_phonation);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        myContext = this.getContext();

        modalite = "phonation";

        start = view.findViewById(R.id.button);
        say = view.findViewById(R.id.textView);
        progressBar = view.findViewById(R.id.progressBar);

        mActivity = (MainActivity) getActivity();

        start.setOnClickListener(v -> {

            if (mActivity != null && ifPressed == 0) {
                String[] answers = {"Pas de problème de parole.", "Perte de modulation, de diction ou de " +
                        "volume, mais tous les mots sont encore faciles à comprendre.", "Perte de modulation, de " +
                        "diction ou de volume avec quelques mots peu clairs mais la majorité des phrases sont faciles" +
                        " à suivre.", "Le discours est difficile à comprendre à tel point que quelques phrases, mais " +
                        "pas la plupart, sont mal comprises.", "La plupart du discours est difficile à comprendre ou inintelligible."};
                mActivity.popupStartSession(myContext, "Avez vous des problèmes de parole ?", answers, this);
            }
            ifPressed = 1;
        });
    }

    @Override
    public void call() {
        ifPressed = 0;
        start.setVisibility(View.GONE);
        userPhoneSession = new UserPhonationSession();
        startPhonation();
    }

    @Override
    public void cancel() {
        ifPressed = 0;
    }

    class AudioRecordThread implements Runnable {
        @Override
        public void run() {
            loadPerf();
        }
    }


    private void stopPhonation() {
        Handler handler = new Handler();
        handler.postDelayed(() -> {
            AudioRecordUtil.getInstance().stop();

            outPut = Base64.encodeToString(AudioRecordUtil.getInstance().getBuffer(), Base64.DEFAULT);
            AudioRecordUtil.getInstance().realeasOutput();

            progressBar.setVisibility(View.GONE);
            if (mActivity.accord_partage == true) {
                say.setText("Session terminée ! Vos données ont bien été envoyées à DiamPark");
            } else {
                say.setText("Session terminée !");
            }
            start.setText("Recommencer");
            start.setVisibility(View.VISIBLE);
            new Thread(new AudioRecordThread()).start();
        }, 5000);
    }

    private void loadPerf() {
        userPhoneSession.setDate(Calendar.getInstance().getTime());
        userPhoneSession.setState(mActivity.state);
        userPhoneSession.setLevo(mActivity.currentSuivi.concentration());

        if (mActivity != null) {
            userPhoneSession.setHashUser(mActivity.androidUniqueId);
            if (mActivity.accord_partage) {
                JsonObject body = new JsonObject();
                body.addProperty("HashCodeUser", userPhoneSession.getHashUser());
                body.addProperty("Modalite", modalite);
                body.addProperty("JSON_resultats", new Gson().toJson(new Gson().toJson(userPhoneSession)));
                body.addProperty("Fichier_de_sortie", outPut);
                body.addProperty("JSON_levo", new Gson().toJson(new SuiviToPost(mActivity.currentSuivi)));
                Log.i("body", body.toString());
                new Post(body, METHODE.POSTDATA, tmpCallback).start();
            }
            new MyFileManager().writePerfOnInternalStorage(myContext,
                    new Gson().toJson(userPhoneSession), MyFileManager.directoryPhonationName, MyFileManager.filePhonationBaseName);

            userPhoneSession = null;
        }
    }

    private void startPhonation() {
        say.setVisibility(View.VISIBLE);
        say.setText(R.string.phonation_sentence);
        Handler handler = new Handler();
        handler.postDelayed(() -> {
            say.setText("begin recording");
            startRecording();
            progressBar.setVisibility(View.VISIBLE);
        }, 4000);
    }

    private void startRecording() {
        AudioRecordUtil.getInstance().start();
        stopPhonation();
    }
}
