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

import android.content.Context;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextPaint;
import android.text.TextUtils;
import android.text.style.ForegroundColorSpan;
import android.text.style.TypefaceSpan;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.List;

import kz.arta.synergy.workflow.mobile.android.R;
import kz.arta.synergy.workflow.mobile.android.common.utils.Fonts;
import kz.arta.synergy.workflow.mobile.android.common.utils.Utils;
import kz.arta.synergy.workflow.mobile.android.forms.general.components.registrychooser.models.RegistryDataModel;
import kz.arta.synergy.workflow.mobile.android.forms.general.components.registrychooser.models.RegistryInfoModel;

/**
 * Created by neox on 30.05.16.
 * Адаптер для списка в адресной книге
 */
public class RegistryChooserAdapter extends ArrayAdapter<List<RegistryDataModel.Data>> {

    /**
     * Список пользователей
     */
    private List<List<RegistryDataModel.Data>> list;

    /**
     * Контекст
     */
    private Context context;

    /**
     * Тип отображения плашек (true - полный вид, false - только значащее содержимое)
     */
    private boolean showAll;

    /**
     * Информация о реестре
     */
    private RegistryInfoModel info;

    /**
     * Конструктор адаптера списка пользователей
     *
     * @param context контекст приложения
     * @param list    данные в списке
     * @param showAll режим отображения (полный/неполный)
     * @param info    информация о реестре
     */
    public RegistryChooserAdapter(Context context, List<List<RegistryDataModel.Data>> list, boolean showAll, RegistryInfoModel info) {
        super(context, R.layout.registry_chooser_activity, list);
        this.context = context;
        this.list = list;
        this.showAll = showAll;
        this.info = info;
    }

    @Override
    public View getView(int position, View someView, ViewGroup arg2) {

        LayoutInflater inflater = LayoutInflater.from(context);

        if (someView == null) {
            someView = inflater.inflate(R.layout.registry_chooser_item, arg2, false);
        }

        LinearLayout content = (LinearLayout) someView.findViewById(R.id.registry_chooser_item_content);
        content.removeAllViews();
        content.setVisibility(View.VISIBLE);

        List<RegistryDataModel.Data> data = list.get(position);

        someView.setBackgroundColor(context.getResources().getColor((list.get(position).get(0).isSelected()
                ? R.color.selected_item_list_color : android.R.color.transparent)));

        LinearLayout.LayoutParams textParams = new LinearLayout.
                LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);

        for (RegistryInfoModel.Columns column : info.getColumns()) {

            String string = getData(data, column.getColumnID());
            Spannable spannable = new SpannableString(column.getLabel() + ": " + string);
            spannable.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.default_light_gray)),
                    0, column.getLabel().length() + 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            spannable.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.default_darken_gray)),
                    column.getLabel().length() + 2, (column.getLabel() + ": " + string).length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            spannable.setSpan(new CustomTypefaceSpan("", Fonts.getThin(context)),
                    0, column.getLabel().length() + 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            spannable.setSpan(new CustomTypefaceSpan("", Fonts.getMedium(context)),
                    column.getLabel().length() + 2, (column.getLabel() + ": " + string).length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            TextView text = new TextView(context);
            text.setLayoutParams(textParams);
            text.setText(spannable);
            text.setMaxLines(2);
            text.setEllipsize(TextUtils.TruncateAt.END);
            text.setTextSize(Utils.getPxFromDp(R.dimen.registry_chooser_text_size, context));

            if (!showAll) {
                if (column.getVisible().equals("1") && column.getBody().equals("1")) {
                    content.addView(text);
                }
            } else {
                if (column.getVisible().equals("1")) {
                    content.addView(text);
                }
            }
        }

        return someView;
    }

    /**
     * Метод возвращает данные компонента по uuid
     *
     * @param data     лист данных текущей записи
     * @param columnID идентификатор компонента для которого получаем данные
     * @return данные компонента
     */
    private String getData(List<RegistryDataModel.Data> data, String columnID) {
        for (RegistryDataModel.Data data1 : data) {
            if (data1.getCmp_id() != null && data1.getCmp_id().equals(columnID)) {
                return data1.getCmp_data();
            }
        }
        return "";
    }

    public void setShowAll(boolean showAll) {
        this.showAll = showAll;
    }

    public class CustomTypefaceSpan extends TypefaceSpan {

        private final Typeface newType;

        public CustomTypefaceSpan(String family, Typeface type) {
            super(family);
            newType = type;
        }

        @Override
        public void updateDrawState(TextPaint ds) {
            applyCustomTypeFace(ds, newType);
        }

        @Override
        public void updateMeasureState(TextPaint paint) {
            applyCustomTypeFace(paint, newType);
        }

        private void applyCustomTypeFace(Paint paint, Typeface tf) {
            int oldStyle;
            Typeface old = paint.getTypeface();
            if (old == null) {
                oldStyle = 0;
            } else {
                oldStyle = old.getStyle();
            }
            int fake = oldStyle & ~tf.getStyle();
            if ((fake & Typeface.BOLD) != 0) {
                paint.setFakeBoldText(true);
            }
            if ((fake & Typeface.ITALIC) != 0) {
                paint.setTextSkewX(-0.25f);
            }
            paint.setTypeface(tf);
        }
    }
}