package kz.arta.synergy.workflow.mobile.android.authorization.activities;

import android.accounts.Account;
import android.accounts.AccountAuthenticatorActivity;
import android.accounts.AccountManager;
import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.text.TextUtils;
import android.text.method.PasswordTransformationMethod;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

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

import java.io.File;

import de.hdodenhof.circleimageview.CircleImageView;
import kz.arta.synergy.workflow.mobile.android.R;
import kz.arta.synergy.workflow.mobile.android.authorization.SynergyAccount;
import kz.arta.synergy.workflow.mobile.android.common.ActivityConst;
import kz.arta.synergy.workflow.mobile.android.common.SettingsConst;
import kz.arta.synergy.workflow.mobile.android.common.activities.MainActivity;
import kz.arta.synergy.workflow.mobile.android.common.components.AuthorizationEditText;
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.requests.SendGetRequest;
import kz.arta.synergy.workflow.mobile.android.common.utils.Const;
import kz.arta.synergy.workflow.mobile.android.common.utils.Fonts;
import kz.arta.synergy.workflow.mobile.android.common.utils.MyApplication;

/**
 * Created by neox on 19.11.15.
 */
public class AuthorizationPasswordActivity extends AccountAuthenticatorActivity {

    /**
     * Данные пользователя
     */
    private Person person;

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

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

    /**
     * Компонент для ввода пароля
     */
    private AuthorizationEditText password;

    /**
     * Менеджер аккаунтов
     */
    private AccountManager accountManager;

    /**
     * Имя компании
     */
    private TextView companyName;

    /**
     * Иконка пользователя
     */
    private CircleImageView iconUser;

    /**
     * Имя пользователя
     */
    private TextView userName;

    /**
     * Логин
     */
    private TextView login;

    /**
     * Настройки
     */
    private SharedPreferences settings;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        setContentView(R.layout.authorization_password_activity);
        super.onCreate(savedInstanceState);

        ActionBar actionBar = getActionBar();
        if (actionBar != null) {
            actionBar.hide();
        }

        // текущее активити
        activity = this;

        // прогрессбар
        progressBar = (ProgressWheel) findViewById(R.id.authorization_password_progress_bar);

        // настройки
        settings = getSharedPreferences(SettingsConst.DEFAULT_NAME_SETTINGS, Context.MODE_PRIVATE);

        // если аккаунт есть - получаем список аккаунтов и берем первый в списке подходящий под наше условие
        accountManager = AccountManager.get(activity);

        Account[] accounts = accountManager.getAccounts();

        for (Account account : accounts) {
            if (!account.type.equals(SynergyAccount.TYPE)) {
                continue;
            }
            person = new Person();
            person.setLogin(accountManager.getUserData(account, SynergyAccount.LOGIN));
            person.setShortHost(accountManager.getUserData(account, SynergyAccount.SHORT_HOST));
            person.setHost(accountManager.getUserData(account, SynergyAccount.HOST));
            break;
        }

        // инициализация
        init();
    }

    /**
     * Инициализация компонентов
     */
    private void init() {

        // кнопка "Войти"
        Button enter = (Button) findViewById(R.id.authorization_enter_button);
        enter.setTypeface(Fonts.getMedium(activity));
        enter.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                person.setPassword(password.getText().toString());
                auth();
            }
        });

        // кнопка "Изменить параметры"
        TextView changeParams = (TextView) findViewById(R.id.authorization_change_params_button);
        changeParams.setTypeface(Fonts.getRoman(activity));
        changeParams.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(activity, AuthorizationActivity.class);
                intent.putExtra(ActivityConst.PERSON, person);
                startActivity(intent);
                finish();
            }
        });

        // имя сервера
        companyName = (TextView) findViewById(R.id.authorization_company_name);
        companyName.setTypeface(Fonts.getRoman(activity));

        // url сервера
        TextView companyUrl = (TextView) findViewById(R.id.authorization_company_url);
        companyUrl.setTypeface(Fonts.getRoman(activity));
        companyUrl.setText(person.getShortHost());

        // имя пользователя
        userName = (TextView) findViewById(R.id.authorization_user_name);
        userName.setTypeface(Fonts.getRoman(activity));

        // логин пользователя
        login = (TextView) findViewById(R.id.authorization_login);
        login.setTypeface(Fonts.getRoman(activity));

        // заголовок к паролю
        TextView passwordTitle = (TextView) findViewById(R.id.authorization_password_title);
        passwordTitle.setTypeface(Fonts.getRoman(activity));

        // компонент для ввода пароля
        password = (AuthorizationEditText) findViewById(R.id.authorization_password);
        password.getEditText().setTransformationMethod(PasswordTransformationMethod.getInstance());
        password.disableIcon();

        iconUser = (CircleImageView) findViewById(R.id.authorization_password_icon_user);
    }

    /**
     * Метод пытается залогинить пользователя в системе
     */
    @SuppressLint("StaticFieldLeak")
    private void auth() {

        // валидация поля
        if (TextUtils.isEmpty(password.getText())) {
            password.setErrorBackground();
        } else {
            password.setNormalBackground();
        }

        // если пользователь не ввел пароль - отображаем соответствующее сообщение
        if (TextUtils.isEmpty(password.getText())) {
            AppMsg.makeTextBottom(activity, getString(R.string.enter_password)).show();
            return;
        }

        new SendGetRequest("rest/api/person/auth?locale=" + MyApplication.getLang(), person) {

            @Override
            protected void onPreExecute() {
                progressBar.setVisibility(View.VISIBLE);
                person.setPassword(password.getText().toString());
                super.onPreExecute();
            }

            @Override
            protected void onPostExecute(String result) {

                progressBar.setVisibility(View.GONE);

                if (result == null) {
                    AppMsg.makeTextBottom(activity, getString(R.string.check_login_password)).show();
                    password.setErrorBackground();
                    return;
                }

                try {

                    // информация о пользователе
                    UserInfo userInfo = RestClient.getGson().fromJson(result, UserInfo.class);
                    if (userInfo == null) {
                        AppMsg.makeTextBottom(activity, getString(R.string.check_login_password)).show();
                        password.setErrorBackground();
                        return;
                    }

                    // дозаполняем данными объект person
                    person.setUuid(userInfo.getUserid());
                    person.setFirstname(userInfo.getFirstname());
                    person.setLastname(userInfo.getLastname());

                    // формируем объект synergyAccount с полученными данными
                    SynergyAccount synergyAccount = SynergyAccount.getSynergyAccount(person);
                    accountManager.setPassword(synergyAccount, person.getPassword());
                    accountManager.setUserData(synergyAccount, SynergyAccount.LOGIN, person.getLogin());
                    accountManager.setUserData(synergyAccount, SynergyAccount.HOST, person.getHost());
                    accountManager.setUserData(synergyAccount, SynergyAccount.SHORT_HOST, person.getShortHost());
                    accountManager.setUserData(synergyAccount, SynergyAccount.USER_ID, person.getUuid());
                    accountManager.setUserData(synergyAccount, SynergyAccount.FIRSTNAME, person.getFirstname());
                    accountManager.setUserData(synergyAccount, SynergyAccount.LASTNAME, person.getLastname());

                    getSettings();

                } catch (Exception exc) {
                    AppMsg.makeTextBottom(activity, getString(R.string.error_request)).show();
                }
                super.onPostExecute(result);
            }
        }.execute();
    }

    /**
     * Метод загружает настройки
     */
    @SuppressLint("StaticFieldLeak")
    private void getSettings() {
        new SendGetRequest("rest/api/settings/get?locale=" + MyApplication.getLang(), person) {
            @Override
            protected void onPostExecute(String result) {
                if (result != null) {
                    // основные настройки приложения
                    SharedPreferences.Editor editor = settings.edit();
                    editor.putString(SettingsConst.SETTINGS, result);
                    editor.apply();
                    // получение дефолтных настроек для создания работы
                    getCreateDefaults();
                    // згрузка процессов
                    getProcesses();
                    // загрузка нагрузок
                    getWorkLoads();
                    // открываем нужный экран
                    Intent intent = new Intent(activity, MainActivity.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);
                    finish();
                }
                super.onPostExecute(result);
            }
        }.execute();
    }

    /**
     * Метод загружает дефолтные параметры для создания работы/резолюции
     */
    @SuppressLint("StaticFieldLeak")
    private void getCreateDefaults() {
        new SendGetRequest("rest/api/workflow/work/create_defaults", person) {
            @Override
            protected void onPostExecute(String result) {
                if (result == null) {
                    return;
                }
                SharedPreferences.Editor editor = settings.edit();
                editor.putString(SettingsConst.DEFAULTS, result);
                editor.apply();
                super.onPostExecute(result);
            }
        }.execute();
    }

    /**
     * Метод загружает список процессов
     */
    @SuppressLint("StaticFieldLeak")
    private void getProcesses() {
        new SendGetRequest("rest/api/settings/get_processes?locale=" + MyApplication.getLang(), person) {
            @Override
            protected void onPostExecute(String result) {
                if (result == null) {
                    return;
                }
                SharedPreferences.Editor editor = settings.edit();
                editor.putString(SettingsConst.PROCESSES, result);
                editor.apply();
                super.onPostExecute(result);
            }
        }.execute();
    }

    /**
     * Метод загружает список нагрузок
     */
    @SuppressLint("StaticFieldLeak")
    private void getWorkLoads() {
        new SendGetRequest("rest/api/projects/get_work_loads?locale=" + MyApplication.getLang(), person) {
            @Override
            protected void onPostExecute(String result) {
                if (result == null) {
                    return;
                }
                SharedPreferences.Editor editor = settings.edit();
                editor.putString(SettingsConst.WORK_LOADS, result);
                editor.apply();
                super.onPostExecute(result);
            }
        }.execute();
    }

    @Override
    protected void onResume() {
        Account[] accounts = accountManager.getAccounts();
        for (Account account : accounts) {
            if (!account.type.equals(SynergyAccount.TYPE)) {
                continue;
            }
            if (accountManager.getUserData(account, SynergyAccount.SERVER_NAME) == null ||
                    accountManager.getUserData(account, SynergyAccount.SERVER_NAME).isEmpty()) {
                // placeholder
                companyName.setText("ARTA Synergy");
            } else {
                companyName.setText(accountManager.getUserData(account, SynergyAccount.SERVER_NAME));
            }
            // имя пользователя
            if (accountManager.getUserData(account, SynergyAccount.FIRSTNAME) != null &&
                    !accountManager.getUserData(account, SynergyAccount.FIRSTNAME).isEmpty() &&
                    accountManager.getUserData(account, SynergyAccount.LASTNAME) != null &&
                    !accountManager.getUserData(account, SynergyAccount.LASTNAME).isEmpty()) {
                // placeholder
                userName.setText(accountManager.getUserData(account, SynergyAccount.FIRSTNAME) + " " +
                        accountManager.getUserData(account, SynergyAccount.LASTNAME));
                login.setText(accountManager.getUserData(account, SynergyAccount.LOGIN));
            } else {
                userName.setText(accountManager.getUserData(account, SynergyAccount.LOGIN));
                login.setText("");
            }
        }
        File file = new File(Environment.getExternalStorageDirectory() +
                File.separator + Const.DIRECTORY_PHOTOS_NAME + File.separator + Const.USER_ICON_NAME);
        if (file.exists()) {
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inPreferredConfig = Bitmap.Config.ARGB_8888;
            Bitmap bitmap = BitmapFactory.decodeFile(file.getPath(), options);
            iconUser.setImageBitmap(bitmap);
        } else {
            iconUser.setImageDrawable(getResources().getDrawable(R.drawable.icon_user));
        }
        super.onResume();
    }

    /**
     * Нужная информация из api метода
     */
    private class UserInfo {

        /**
         * Идентификатор пользователя
         */
        String userid;

        /**
         * Имя пользователя
         */
        String lastname;

        /**
         * Фамилия
         */
        String firstname;

        public String getLastname() {
            return lastname;
        }

        public String getFirstname() {
            return firstname;
        }

        public String getUserid() {
            return userid;
        }
    }
}
