package kz.arta.synergy.workflow.mobile.android.works.manager.send;

import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.util.Base64;
import android.view.View;

import com.devspark.appmsg.AppMsg;
import com.pnikosis.materialishprogress.ProgressWheel;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

import kz.arta.synergy.workflow.mobile.android.R;
import kz.arta.synergy.workflow.mobile.android.common.models.ErrorCode;
import kz.arta.synergy.workflow.mobile.android.common.models.Person;
import kz.arta.synergy.workflow.mobile.android.common.requests.RestClient;
import kz.arta.synergy.workflow.mobile.android.common.utils.MyApplication;
import kz.arta.synergy.workflow.mobile.android.common.utils.Wrapper;

/**
 * Created by neox on 07.05.14.
 * Передача работы другому пользователю
 */
public class TransmitWork extends AsyncTask<Void, Void, String> {

    /**
     * Активити
     */
    private Activity activity;

    /**
     * Пользователь
     */
    private Person person;

    /**
     * Прогрессбар
     */
    private ProgressWheel progressBar;

    /**
     * UUID работы
     */
    private String workID;

    /**
     * Текст работы
     */
    private String name;

    /**
     * UUID пользователя, которому передается работа
     */
    private String userID;

    public void setProgressBar(ProgressWheel progressBar) {
        this.progressBar = progressBar;
    }

    public void setWorkID(String workID) {
        this.workID = workID;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setUserID(String userID) {
        this.userID = userID;
    }

    public void setActivity(Activity activity) {
        this.activity = activity;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    /**
     * Метод передает работу другом пользователю
     * В случае успешного выполнения - возвращает строку в формате json
     *
     * @return - результат запроса в формате json
     */
    public String transfer() {
        try {
            URL url = new URL(person.getHost() + "rest/api/workflow/work/transfer");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Accept", "application/json; charset=utf-8");
            conn.setRequestProperty("Connection", "Keep-Alive");
            conn.setRequestProperty("Cache-Control", "no-cache");
            String basicAuth = "Basic " + new String(Base64.encode(person.getAuth().getBytes(), Base64.NO_WRAP));
            conn.setRequestProperty("Authorization", basicAuth);
            conn.setUseCaches(false);
            conn.setDoInput(true);
            conn.setDoOutput(true);
            DataOutputStream request = new DataOutputStream(conn.getOutputStream());
            request.writeBytes("userID=" + URLEncoder.encode(userID, "utf-8") + "&");
            request.writeBytes("name=" + URLEncoder.encode(name, "utf-8") + "&");
            request.writeBytes("workID=" + URLEncoder.encode(workID, "utf-8") + "&");
            request.writeBytes("locale=" + URLEncoder.encode(MyApplication.getLang(), "utf-8") + "&");
            request.flush();
            request.close();
            InputStream is = conn.getInputStream();
            BufferedReader rd = new BufferedReader(new InputStreamReader(is));
            String line;
            StringBuilder response = new StringBuilder();
            while ((line = rd.readLine()) != null) {
                response.append(line);
                response.append('\r');
            }
            rd.close();
            return response.toString();
        } catch (Exception e) {
            return null;
        }
    }

    @Override
    protected void onPreExecute() {
        progressBar.setVisibility(View.VISIBLE);
        super.onPreExecute();
    }

    /**
     * Если работа успешно передалась - отправляем интент в активити с информацией о работе
     * Иначе - отображаем сообщение об ошибке
     *
     * @param result - результат запроса в формате json
     */
    @Override
    protected void onPostExecute(String result) {
        progressBar.setVisibility(View.GONE);
        try {
            ErrorCode errorCode = RestClient.getGson().fromJson(result, ErrorCode.class);
            if (errorCode.getErrorCode().equals(Wrapper.NO_ERROR)) {
                Intent intent = new Intent();
                activity.setResult(Activity.RESULT_OK, intent);
                activity.finish();
            } else {
                AppMsg.makeText(activity, errorCode.getErrorMessage(), AppMsg.STYLE_ALERT).show();
            }
        } catch (Exception exc) {
            AppMsg.makeText(activity, activity.getResources().getString(R.string.error_request), AppMsg.STYLE_ALERT).show();
        }
        super.onPostExecute(result);
    }

    @Override
    protected String doInBackground(Void... voids) {
        return transfer();
    }
}
