package me.grishka.videotranscoder;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.media.MediaMetadataRetriever;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;

import java.io.File;


public class MainActivity extends Activity{

	private VideoConverter videoConverter;
	private String chosenFile=null;
	private SeekBar videoBitrateSlider, audioBitrateSlider, scalingFactorSlider;
	private TextView videoBitrateValue, audioBitrateValue, scalingFactorValue;
	private SeekBar.OnSeekBarChangeListener seekBarListener=new SeekBar.OnSeekBarChangeListener(){
		@Override
		public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser){
			switch(seekBar.getId()){
				case R.id.video_bitrate_slider:
					videoBitrateValue.setText(progress+"");
					break;
				case R.id.audio_bitrate_slider:
					audioBitrateValue.setText(progress+"");
					break;
				case R.id.scaling_factor_slider:
					scalingFactorValue.setText((progress+1)+"");
					break;
			}
		}

		@Override
		public void onStartTrackingTouch(SeekBar seekBar){

		}

		@Override
		public void onStopTrackingTouch(SeekBar seekBar){

		}
	};

	private static final int PICK_RESULT=101;

	@Override
	protected void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		findViewById(R.id.btn_pick).setOnClickListener(new View.OnClickListener(){
			@Override
			public void onClick(View v){
				Intent intent=new Intent(Intent.ACTION_PICK);
				intent.setType("video/*");
				startActivityForResult(intent, PICK_RESULT);
			}
		});
		findViewById(R.id.btn_start).setOnClickListener(new View.OnClickListener(){
			@Override
			public void onClick(View v){
				doConvert(chosenFile, ((TextView)findViewById(R.id.edit_output_file)).getText().toString());
			}
		});

		videoBitrateSlider=(SeekBar)findViewById(R.id.video_bitrate_slider);
		audioBitrateSlider=(SeekBar)findViewById(R.id.audio_bitrate_slider);
		scalingFactorSlider=(SeekBar)findViewById(R.id.scaling_factor_slider);
		videoBitrateValue=(TextView)findViewById(R.id.video_bitrate_value);
		audioBitrateValue=(TextView)findViewById(R.id.audio_bitrate_value);
		scalingFactorValue=(TextView)findViewById(R.id.scaling_factor_value);

		videoBitrateSlider.setOnSeekBarChangeListener(seekBarListener);
		audioBitrateSlider.setOnSeekBarChangeListener(seekBarListener);
		scalingFactorSlider.setOnSeekBarChangeListener(seekBarListener);
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data){
		if(requestCode==PICK_RESULT && resultCode==RESULT_OK){
			chosenFile=data.getData().toString();
			((TextView)findViewById(R.id.file_name)).setText(chosenFile);
			findViewById(R.id.btn_start).setEnabled(true);
		}
	}

	private void doConvert(String fromFile, String toFile){
		final ProgressDialog progress=new ProgressDialog(this);
		progress.setTitle("Compressing video");
		progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
		progress.setCancelable(false);
		progress.setButton(ProgressDialog.BUTTON_POSITIVE, "Cancel", new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				videoConverter.cancel();
				progress.dismiss();
			}
		});
		progress.show();

		VideoConverter.Callback callback=new VideoConverter.Callback() {
			@Override
			public void onProgressUpdated(final int done, final int total) {
				runOnUiThread(new Runnable() {
					@Override
					public void run() {
						progress.setMax(total);
						progress.setProgress(done);
					}
				});
			}

			@Override
			public void onConversionCompleted() {
				runOnUiThread(new Runnable() {
					@Override
					public void run() {
						progress.dismiss();
						videoConverter=null;
						Toast.makeText(MainActivity.this, "Done!", Toast.LENGTH_SHORT).show();
					}
				});
			}

			@Override
			public void onConversionFailed(final String error) {
				runOnUiThread(new Runnable() {
					@Override
					public void run() {
						progress.dismiss();
						new AlertDialog.Builder(MainActivity.this)
								.setTitle("Error")
								.setMessage(error)
								.setPositiveButton("OK", null)
								.show();
					}
				});
			}

			@Override
			public void onReady() {
				videoConverter.start();
			}
		};
		int scalingFactor=scalingFactorSlider.getProgress()+1;
		MediaMetadataRetriever mmr=new MediaMetadataRetriever();
		mmr.setDataSource(this, Uri.parse(fromFile));
		int vw=Integer.parseInt(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH));
		int vh=Integer.parseInt(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT));
		mmr.release();
		videoConverter=new VideoConverter(fromFile, toFile, videoBitrateSlider.getProgress(), audioBitrateSlider.getProgress(), Math.max(vw, vh)/scalingFactor, callback, this);
	}
}