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

/**
 * Created by neox on 19.04.14.
 * Отправка работы (согласование/утверждение/ознакомление/перепоручение)
 */
public class SendWork extends AsyncTask<Void, Void, String> {

    /**
     * Данные по маршруту
     */
    private SendWorkData sendWorkData;

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

    /**
     * Активити из которого запускается метод
     */
    private Activity activity;

    /**
     * Прогрессбар (отключается при успешном выполнении)
     */
    private ProgressWheel progressBar;

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

        try {

            URL url = new URL(person.getHost() + "rest/api/workflow/work/start_route");
            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("name=" + URLEncoder.encode(sendWorkData.getName(), "utf-8") + "&");
            request.writeBytes("type=" + URLEncoder.encode(sendWorkData.getType(), "utf-8") + "&");
            request.writeBytes("finishDate=" + URLEncoder.encode(sendWorkData.getFinishDate() + ":00", "utf-8") + "&");

            // сводящий
            if (sendWorkData.getResUserID() != null) {
                request.writeBytes("userID=" + URLEncoder.encode(sendWorkData.getResUserID(), "utf-8") + "&");
            }

            // исполнители
            if (sendWorkData.getUsers() != null) {
                for (int i = 0; i < sendWorkData.getUsers().size(); i++) {
                    request.writeBytes("resUserID=" + URLEncoder.encode(sendWorkData.getUsers().get(i), "utf-8") + "&");
                }
            }

            // форма завершения
            if (sendWorkData.getCompletionFormID() != null) {
                request.writeBytes("completionFormID=" + URLEncoder.encode(sendWorkData.getCompletionFormID(), "utf-8") + "&");
            }

            if (sendWorkData.getDocumentID() != null) {
                request.writeBytes("documentID=" + URLEncoder.encode(sendWorkData.getDocumentID(), "utf-8") + "&");
            } else if (sendWorkData.getWorkID() != null) {
                request.writeBytes("workID=" + URLEncoder.encode(sendWorkData.getWorkID(), "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.getResources().getString(R.string.error_request), AppMsg.STYLE_ALERT).show();
            return;
        }
        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 sendWork();
    }

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

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

    public void setSendWorkData(SendWorkData sendWorkData) {
        this.sendWorkData = sendWorkData;
    }

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