/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * 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.
 */

package org.drrickorang.loopback;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;


/**
 * Creates a list of time intervals where glitches occurred.
 */

public class GlitchesStringBuilder {
    private static final String TAG = "GlitchesStringBuilder";


    public static String getGlitchString(int fftsamplingsize, int FFTOverlapSamples,
                                         int[] glitchesData, int samplingRate,
                                         boolean glitchingIntervalTooLong, int numberOfGlitches) {
        int newSamplesPerFFT = fftsamplingsize - FFTOverlapSamples;

        // the time span of new samples for a single FFT in ms
        double newSamplesInMs = ((double) newSamplesPerFFT / samplingRate) *
                                Constant.MILLIS_PER_SECOND;
        log("newSamplesInMs: " + Double.toString(newSamplesInMs));

        // the time span of all samples for a single FFT in ms
        double allSamplesInMs = ((double) fftsamplingsize / samplingRate) *
                                Constant.MILLIS_PER_SECOND;
        log("allSamplesInMs: " + Double.toString(allSamplesInMs));

        StringBuilder listOfGlitches = new StringBuilder();
        listOfGlitches.append("Total Glitching Interval too long: " +
                glitchingIntervalTooLong + "\n");
        listOfGlitches.append("Estimated number of glitches: " + numberOfGlitches + "\n");
        listOfGlitches.append("List of glitching intervals: \n");

        for (int i = 0; i < glitchesData.length; i++) {
            int timeInMs; // starting time of glitches
            //append the time of glitches to "listOfGlitches"
            timeInMs = (int) (glitchesData[i] * newSamplesInMs); // round down
            listOfGlitches.append(timeInMs + "~" + (timeInMs + (int) allSamplesInMs) + "ms\n");
        }

        return listOfGlitches.toString();
    }

    /** Generate String of Glitch Times in ms return separated. */
    public static String getGlitchStringForFile(int fftSamplingSize, int FFTOverlapSamples,
                                                int[] glitchesData, int samplingRate) {
        int newSamplesPerFFT = fftSamplingSize - FFTOverlapSamples;

        // the time span of new samples for a single FFT in ms
        double newSamplesInMs = ((double) newSamplesPerFFT / samplingRate) *
                Constant.MILLIS_PER_SECOND;

        StringBuilder listOfGlitches = new StringBuilder();

        for (int i = 0; i < glitchesData.length; i++) {
            int timeInMs; // starting time of glitches
            //append the time of glitches to "listOfGlitches"
            timeInMs = (int) (glitchesData[i] * newSamplesInMs); // round down
            listOfGlitches.append(timeInMs + "\n");
        }

        return listOfGlitches.toString();
    }

    /** Generate array of Glitch Times in ms */
    public static int[] getGlitchMilliseconds(int fftSamplingSize, int FFTOverlapSamples,
                                                int[] glitchesData, int samplingRate) {
        int[] glitchMilliseconds = new int[glitchesData.length];
        int newSamplesPerFFT = fftSamplingSize - FFTOverlapSamples;

        // the time span of new samples for a single FFT in ms
        double newSamplesInMs = ((double) newSamplesPerFFT / samplingRate) *
                Constant.MILLIS_PER_SECOND;

        for (int i = 0; i < glitchesData.length; i++) {
            glitchMilliseconds[i] = (int) (glitchesData[i] * newSamplesInMs); // round down
        }

        return glitchMilliseconds;
    }

    private static void log(String msg) {
        Log.v(TAG, msg);
    }

}
