/***
 * Wyciąg z książki "Hello, Android!",
 * opublikowanej przez wydawnictwo Helion S.A.
 * Niniejszy kod jest chroniony prawami autorskimi. Nie może zostać wykorzystany do utworzenia 
 * materiałów treningowych, kursów, książek, artykułów, itp. Prosimy o kontakt w razie
 * pojawienia się wątpliwości.
 * Nie gwarantujemy, że niniejszy kod będzie się nadawał do jakiegokolwiek celu. 
 * Więcej informacji można znaleźć na stronie http://www.pragmaticprogrammer.com/titles/eband.
***/
package org.przyklad.translator;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.io.Writer;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

public class ZadanieTlum implements Runnable {
    private static final String ZNACZNIK = "ZadanieTłumaczenia" ;
    private final Translator translator;
    private final String oryginal, z, na;

    ZadanieTlum(Translator translator, String oryginal, String z,
            String na) {
        this.translator = translator;
        this.oryginal = oryginal;
        this.z = z;
        this.na = na;
    }

    public void run() {
        // Tłumaczy oryginalny tekst na język docelowy
        String tlum = robTlumaczenie(oryginal, z, na);
        translator.ustawPrzetlumaczone(tlum);

        // Następnie otrzymany wynik zostaje przełożony na język oryginału.
        // W idealnym przypadku powinno się ono pokrywać z pierwotnym zdaniem, ale zazwyczaj tak nie jest.
        String pontlum = robTlumaczenie(tlum, na, z); // zamienione
        translator.ustawPonowniePrzetlum(pontlum);
    }

    /**
    * Wywołuje interfejs Tłumacz Google, tłumaczący ciąg znaków
    * z jednego języka na inny. Więcej informacji na temat tego interfejsu API:
    * http://code.google.com/apis/ajaxlanguage
    */
    private String robTlumaczenie(String oryginal, String z,
            String na) {
        String wynik = translator.getResources().getString(
                R.string.tlumaczenie_blad);
        HttpURLConnection pol = null;
        Log.d(ZNACZNIK, "robTlumaczenie(" + oryginal + ", " + z + ", "
                + na + ")" );

        try {
            // Sprawdza, czy zadanie zostało przerwane
            if (Thread.interrupted())
                throw new InterruptedException();

            // Tworzy zapytanie typu RESTful dla interfejsu Google API
            String q = URLEncoder.encode(oryginal, "UTF-8" );
            URL url = new URL(
                    "http://ajax.googleapis.com/ajax/services/language/translate"
                        + "?v=1.0" + "&q=" + q + "&langpair=" + z
                        + "%7C" + na);
            pol = (HttpURLConnection) url.openConnection();
            pol.setReadTimeout(10000 /* millisekundy */);
            pol.setConnectTimeout(15000 /* millisekundy */);
            pol.setRequestMethod("GET" );
            pol.addRequestProperty("Referer" ,
                    "http://www.pragprog.com/titles/eband3/hello-android" );
            pol.setDoInput(true);

            // Uruchamia zapytanie
            pol.connect();

            // Sprawdza, czy zadanie zostało przerwane
            if (Thread.interrupted())
                throw new InterruptedException();

            // Odczytuje wyniki zapytania
            InputStreamReader czytnik = new InputStreamReader(
                    pol.getInputStream(), "UTF-8");
            char[] bufor = new char[1024]; // znaki <= bajty
            int dl = -1;
            Writer pisarz = new StringWriter();
            while ((dl = czytnik.read(bufor)) != -1) {
            	pisarz.write(bufor, 0, dl);
            }
            String ladunek = pisarz.toString();
            czytnik.close();


            // Analizuje składnię w celu uzyskania przetłumaczonego tekstu
            JSONObject obiektJson = new JSONObject(ladunek);
            wynik = obiektJson.getJSONObject("responseData" )
                    .getString("translatedText" )
                    .replace("&#39;" , "'" )
                    .replace("&amp;" , "&" );

            // Sprawdza, czy zadanie zostało przerwane
            if (Thread.interrupted())
                throw new InterruptedException();

        } catch (IOException e) {
            Log.e(ZNACZNIK, "IOException" , e);
        } catch (JSONException e) {
            Log.e(ZNACZNIK, "JSONException" , e);
        } catch (InterruptedException e) {
            Log.d(ZNACZNIK, "InterruptedException" , e);
            wynik = translator.getResources().getString(
                     R.string.tlumaczenie_przerwane);
        } finally {
            if (pol != null) {
                pol.disconnect();
            }
        }

        // Wszystko zrobione
        Log.d(ZNACZNIK, " -> zwrócono " + wynik);
        return wynik;
    }
}

