package kz.arta.synergy.workflow.mobile.android.forms.mobile.components;

import android.app.Activity;
import android.widget.LinearLayout;

import com.devspark.appmsg.AppMsg;

import kz.arta.synergy.workflow.mobile.android.R;
import kz.arta.synergy.workflow.mobile.android.common.requests.RestClient;
import kz.arta.synergy.workflow.mobile.android.forms.mobile.FormConstants;

/**
 * Created by neox on 30.06.15.
 * Просмоторщик форм
 */
public class MobileFormView {

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

    /**
     * Леяут, на котором будут расположены все компоненты
     */
    private LinearLayout layout;

    /**
     * Описание мобильной формы
     */
    private MobileFormDescription[] mobile;

    public MobileFormView(Activity activity, LinearLayout layout, String form) {
        this.activity = activity;
        this.layout = layout;
        init(form);
    }

    /**
     * Десериализация строки
     *
     * @param form описание формы в мобильном представлении
     */
    private void init(String form) {
        if (form == null) {
            return;
        }
        mobile = null;
        try {
            mobile = RestClient.getGson().fromJson(form, MobileFormDescription[].class);
        } catch (Exception exc) {
            AppMsg.makeText(activity, activity.getString(R.string.error_request), AppMsg.STYLE_ALERT).show();
        }
        if (mobile != null) {
            initComponents(mobile);
        }
    }

    /**
     * Инициализация компонентов
     *
     * @param description список компонентов
     */
    private void initComponents(MobileFormDescription[] description) {
        for (MobileFormDescription item : description) {
            switch (item.type) {
                case FormConstants.LABEL:
                    layout.addView(getLabel(item));
                    break;
                case FormConstants.TEXT_BOX:
                    layout.addView(getTextBox(item));
                    break;
                case FormConstants.TEXT_AREA:
                    layout.addView(getTextArea(item));
                    break;
                case FormConstants.LIST_BOX:
                    layout.addView(getListBox(item));
                    break;
            }
        }
    }

    /**
     * Метод возвращает готовый компонент на основе описания (Неизменяемый текст)
     *
     * @param item описание
     * @return View
     */
    private FormLabel getLabel(MobileFormDescription item) {
        IMobileComponents component = new FormLabel(activity);
        component.setId(item.id);
        component.setLabel(item.label);
        component.setValue(item.value);
        component.setType(item.type);
        component.enabled((item.enabled.equals("true")));
        return (FormLabel) component;
    }

    /**
     * Метод возвращает готовый компонент на основе описания (Неизменяемый текст)
     *
     * @param item описание
     * @return View
     */
    private FormTextBox getTextBox(MobileFormDescription item) {
        IMobileComponents component = new FormTextBox(activity);
        component.setId(item.id);
        component.setLabel(item.label);
        component.setValue(item.value);
        component.setType(item.type);
        component.enabled((item.enabled.equals("true")));
        component.setRequired(item.required);
        return (FormTextBox) component;
    }

    /**
     * Метод возвращает готовый компонент на основе описания (Неизменяемый текст)
     *
     * @param item описание
     * @return View
     */
    private FormTextArea getTextArea(MobileFormDescription item) {
        IMobileComponents component = new FormTextArea(activity);
        component.setId(item.id);
        component.setLabel(item.label);
        component.setValue(item.value);
        component.setType(item.type);
        component.enabled((item.enabled.equals("true")));
        component.setRequired(item.required);
        return (FormTextArea) component;
    }

    /**
     * Метод возвращает готовый компонент на основе описания (Неизменяемый текст)
     *
     * @param item описание
     * @return View
     */
    private FormListBox getListBox(MobileFormDescription item) {
        IListBox component = new FormListBox(activity);
        component.setId(item.id);
        component.setLabel(item.label);
        component.setValue(item.value);
        component.setType(item.type);
        component.setData(item.data);
        component.enabled((item.enabled.equals("true")));
        component.setRequired(item.required);
        return (FormListBox) component;
    }

    /**
     * Метод проверяет обязательность заполненных полей у формы
     *
     * @return true/false
     */
    public boolean isValid() {
        for (int i = 0; i < layout.getChildCount(); i++) {
            if (layout.getChildAt(i) instanceof FormTextBox || layout.getChildAt(i) instanceof FormTextArea) {
                if ((((IMobileComponents) layout.getChildAt(i)).getValue()).isEmpty()) {
                    for (MobileFormDescription mobileForm : mobile) {
                        if (mobileForm.id.equals(((IMobileComponents) layout.getChildAt(i)).getID()) && mobileForm.required.equals("true")) {
                            return false;
                        }
                    }
                }
            }
        }
        return true;
    }

    /**
     * Мобильное представление формы
     */
    public static class MobileFormDescription {

        /**
         * Идентификатор компонента
         */
        String id;

        /**
         * Заголовок над компонентом
         */
        String label;

        /**
         * Тип
         */
        String type;

        /**
         * Текущее значение
         */
        String value;

        /**
         * Включен ли компонент или нет
         */
        String enabled;


        /**
         * Включен ли компонент или нет
         */
        String required;

        /**
         * Данные компонента (имеет смысл только для компонента ListBox)
         */
        Data[] data;
    }

    /**
     * Данные для компонента ListBox
     */
    public static class Data {

        /**
         * Значение
         */
        String label;

        /**
         * Ключ
         */
        String value;

    }
}
