package com.upc.pbe.upcnews;

import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.concurrent.ExecutionException;

import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

//Segona Activity, mostra els directoris i arxius del servidor
public class Directoris extends Activity implements OnItemClickListener {

	final static String TAG = "Directoris";
	private String URL, currentFolder;
	private HTMLParser parser;

	public void onCreate(Bundle savedInstanceState) {
		// Creem el layout
		Log.d(TAG, "onCreated");
		super.onCreate(savedInstanceState);
		// Passem del layout anterior al actual
		setContentView(R.layout.dirs);
		// Canviem la direccio de la URL a la actual
		currentFolder = ((UpcApp) getApplication()).getUrl() + "/";
		URL = currentFolder;
		// Creem un HTMLParser
		parser = new HTMLParser(URL);
		// Fem una llista ListView i la omplim amb la informacio trobada
		((ListView) findViewById(R.id.listView1)).setOnItemClickListener(this);
		this.showResources();
	}

	public void showResources() {
		// Actualitza la informacio que mostra la ListView a mesura que ens
		// desplacem pels directoris
		ArrayList<String> entries;
		Descarrega d = new Descarrega(this);
		try {
			d.execute(new URL(currentFolder));
			entries = parser.parse(d.get());
			this.createEntries(entries);
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (ExecutionException e) {
			e.printStackTrace();
		} catch (IOException e) {
			// Nunca llegara aqui la cosa, y si lo hace ES CULPA DEL SERVIDOR!!
		}
	}

	public void createEntries(ArrayList<String> directories) {
		// Crea les entrades de la ListView
		String[] entries = directories.toArray(new String[directories.size()]);
		ListView listView = (ListView) findViewById(R.id.listView1);
		listView.setAdapter(null);
		ResourceAdapter adapter = new ResourceAdapter(this, R.layout.rowlayout,
				entries);
		listView.setAdapter(adapter);
	}

	public void onItemClick(AdapterView<?> parent, View view, int position,
			long id) {
		// Determina el funcionament al clickar en una de les entrades de al
		// ListView
		String path = ((TextView) ((RelativeLayout) view)
				.findViewById(R.id.rowTextView)).getText().toString();
		// Si es un m3u8, el descarrega, parseja i inicia la reproduccio
		if (path.endsWith(".m3u8")) {
			path = currentFolder + path;
			String playlist;
			try {
				Descarrega d = new Descarrega(this);
				// Descarreguem m3u8
				d.execute(new URL(path));
				playlist = d.get();
				Parser p = new Parser(path.substring(0,
						path.lastIndexOf("/") + 1), this);
				try {
					// Parsing m3u8
					ArrayList<ParentList> m3u8parsed = p.parseFile(playlist);
					Log.d(TAG, "Parsing completat");
					// Creem un gestor HLS
					HLS h = new HLS(m3u8parsed,
							((UpcApp) getApplication()).getLocalPath());
					((UpcApp) getApplication()).setHLS(h);
					// Iniciem la reproduccio
					Intent mIntent = new Intent(this, VideoActivity.class);
					if (((UpcApp) getApplication()).getHLS() != null) {
						startActivity(mIntent);
					} else {
						Toast.makeText(this, "Error en gestor HLS",
								Toast.LENGTH_LONG).show();
					}
				} catch (ErrorException e) {
					Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT)
							.show();
					Log.d(TAG, e.getMessage());
				} catch (WarningException e) {
					Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT)
							.show();
					Log.d(TAG, e.getMessage());
				} catch (InfoException e) {
					Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT)
							.show();
					Log.d(TAG, e.getMessage());
				}
			} catch (IOException e1) {
				// Nunca llegara aqui la cosa, y si lo hace ES CULPA DEL
				// SERVIDOR!!
			} catch (InterruptedException e1) {
				e1.printStackTrace();
			} catch (ExecutionException e1) {
				e1.printStackTrace();
			}
		}
		// Si es una carpeta, hi entra i mostra el seu contingut
		else {
			if (!path.startsWith("http://")) {
				currentFolder += path;
			} else {
				currentFolder = path;
			}
			showResources();
		}
	}

	public boolean onKeyDown(int keyCode, KeyEvent event) {
		// Determina el funcionament al apretar la tecla de tornar enrere
		if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
			if (currentFolder.equals(URL)) {
				super.finish();
				return true;
			}
			currentFolder = currentFolder.substring(0,
					currentFolder.length() - 1);
			currentFolder = currentFolder.substring(0,
					currentFolder.lastIndexOf("/") + 1);
			showResources();
			return true;
		}
		return super.onKeyDown(keyCode, event);
	}

	public boolean onCreateOptionsMenu(Menu menu) {
		// Determina el funcionament al apretar la tecla d'opcions
		getMenuInflater().inflate(R.menu.menu, menu);
		Log.d(TAG, "Menu");
		return true;
	}

	public boolean onOptionsItemSelected(MenuItem item) {
		// Determina el funcionament al clickar en el menu d'opcions
		switch (item.getItemId()) {
		case R.id.itemprefs:
			startActivity(new Intent(this, Prefs.class));
			Log.d(TAG, "Preferencies");
			return true;
		case R.id.itemhelp:
			startActivity(new Intent(this, Help.class));
			Log.d(TAG, "Help");
			return true;
		default:
			return false;
		}
	}

	@Override
	public void onConfigurationChanged(Configuration newConfig) {
		super.onConfigurationChanged(newConfig);
	}
}