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

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.ActivityConst;
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;
import kz.arta.synergy.workflow.mobile.android.works.models.CompletionWorkItem;

/**
 * Created by neox on 21.04.14.
 * Отклонение работы
 */
public class RejectWork extends AsyncTask<Void, Void, String> {

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

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

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

    /**
     * Комментарий (будет добавлен к работе после отклонения)
     */
    private String comment;

    /**
     * Дата начала
     */
    private String startDate;

    /**
     * Дата завершения
     */
    private String finishDate;

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

    /**
     * Прогресс
     */
    private String progress;

    /**
     * UUID результата завершения
     */
    private String resultID;

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

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

    public void setComment(String comment) {
        this.comment = comment;
    }

    public void setStartDate(String startDate) {
        this.startDate = startDate;
    }

    public void setFinishDate(String finishDate) {
        this.finishDate = finishDate;
    }

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

    public void setProgress(String progress) {
        this.progress = progress;
    }

    public void setResultID(String resultID) {
        this.resultID = resultID;
    }

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

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

    /**
     * Метод отправляет запрос на сервер для отклонения результата завершения работы
     * В случае успешного выполнения - сервер возвращает строку в формате json
     * Иначе - возвращает null
     *
     * @return - результат запроса в формате json
     */
    public String reject() {

        try {
            URL url = new URL(person.getHost() + "rest/api/workflow/work/reject_result");
            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("workID=" + URLEncoder.encode(workID, "utf-8") + "&");
            request.writeBytes("resultID=" + URLEncoder.encode(resultID, "utf-8") + "&");
            request.writeBytes("startDate=" + URLEncoder.encode(startDate, "utf-8") + "&");
            request.writeBytes("finishDate=" + URLEncoder.encode(finishDate, "utf-8") + "&");
            request.writeBytes("progress=" + URLEncoder.encode(progress, "utf-8") + "&");
            if (comment != null && comment.length() != 0) {
                request.writeBytes("comment=" + URLEncoder.encode(comment, "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;
        }
    }

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

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