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

import android.content.Context;
import android.util.AttributeSet;

import java.util.HashMap;
import java.util.Map;

import kz.arta.synergy.workflow.mobile.android.R;
import kz.arta.synergy.workflow.mobile.android.common.utils.Utils;
import kz.arta.synergy.workflow.mobile.android.documents.route.RoutesConst;

/**
 * Created by neox on 29.07.15.
 * Компонент для ввода нагрузки
 */
public class WorkLoadEditText extends AEditText {

    protected Map<String, String> validExtensions = new HashMap<String, String>();
    private double value;
    private String type = RoutesConst.PERCENT;

    private boolean isValid = true;

    public WorkLoadEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        validExtensions.put("д", RoutesConst.LENGTH_DAYS);
        validExtensions.put("ч", RoutesConst.LENGTH_HOURS);
        validExtensions.put("%", RoutesConst.PERCENT);
    }

    @Override
    protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
        super.onTextChanged(text, start, lengthBefore, lengthAfter);
        check(text.toString());
    }

    /**
     * Метод возвращает постфикс в зависимости от типа нагрузки
     *
     * @param type тип нагрузки
     * @return значение
     */
    private String getStrValue(String type) {
        for (String str : validExtensions.keySet()) {
            if (validExtensions.get(str).equals(type)) {
                return str;
            }
        }
        return "";
    }

    /**
     * Метод вызывается каждый раз, при изменении текста в компоненте
     *
     * @param text текущий текст, который находится в компоненте
     */
    public void check(String text) {
        setValid(true);
        if (text.length() == 0) {
            isValid = false;
            setValid(false);
            return;
        }
        if (Utils.getDoubleStat(text) != 0) {
            type = RoutesConst.LENGTH_HOURS;
            value = Utils.getDoubleStat(text);
            isValid = false;
            setValid(false);
            return;
        }
        String newType = null;
        double newValue = 0;
        boolean found = false;
        isValid = true;
        for (String ext : validExtensions.keySet()) {
            if (text.endsWith(ext)) {
                found = true;
                newType = validExtensions.get(ext);
                break;
            }
        }
        if (!found) {
            isValid = false;
        } else {
            text = text.substring(0, text.length() - 1);
            if (text.length() == 0) {
                isValid = false;
            } else {
                newValue = Utils.getDoubleStat(text);
                if (newValue <= 0) {
                    isValid = false;
                }
            }
        }
        if (isValid) {
            type = newType;
            value = newValue;
        }
        setValid(isValid);
    }

    /**
     * Метод возвращает текущий тип
     *
     * @return тип
     * @see RoutesConst#LENGTH_HOURS
     * @see RoutesConst#LENGTH_DAYS
     * @see RoutesConst#LENGTH_DATE
     */
    public String getType() {
        return type;
    }

    /**
     * Метод устанавливает тип текущей нагрузки
     *
     * @param type текущий тип нагрузки
     */
    public void setType(String type) {
        this.type = type;
    }

    /**
     * Метод возвращает текущее значение компонента (double)
     *
     * @return текущее значение
     */
    public String getValue() {
        return String.valueOf(value);
    }

    /**
     * Метод устанавливает значение в компонент
     *
     * @param value текст
     */
    public void setValue(String value) {
        setText(value + getStrValue(type));
    }

    /**
     * Валидно ли текущее поле
     *
     * @return true/false
     */
    public boolean isValid() {
        return isValid;
    }

    /**
     * Метод изменяет стиль компонента в зависимости от того, валидная ли строка введена
     *
     * @param valid true/false
     */
    private void setValid(boolean valid) {
        if (valid) {
            setBackgroundResource(R.drawable.edit_text_background);
        } else {
            setBackgroundResource(R.drawable.edit_text_background_not_valid);
        }
    }
}
