package org.vaadin.firitin.rad;


import tools.jackson.databind.introspect.AnnotatedMember;
import tools.jackson.databind.introspect.AnnotatedMethod;
import tools.jackson.databind.introspect.BeanPropertyDefinition;

import java.util.Locale;

public interface PropertyContext {

    ValueContext owner();

    BeanPropertyDefinition beanPropertyDefinition();

    default Object getPropertyValue() {
        Object value;
        Object ownerValue = owner().value();
        if (beanPropertyDefinition().hasGetter()) {
            AnnotatedMethod getter = beanPropertyDefinition().getGetter();
            value = getter.getValue(ownerValue);
        } else {
            AnnotatedMember accessor = beanPropertyDefinition().getAccessor();
            if(accessor == null) {
                return "??";
            }
            value = accessor.getValue(ownerValue);
        }
        return value;
    };

    default String getName() {
        return beanPropertyDefinition().getName();
    }

    default String shortToString() {
        return DtoDisplay.toShortString(getPropertyValue());
    }

    default Locale getLocale() {
        return owner().getLocale();
    };

    default ValueContext asValueContext() {
        return new ValueContextImpl(getPrettyPrinter(), getPropertyValue());
    };

    default int getLevel() {
        return owner().getLevel() + 1;
    };

    default PrettyPrinter getPrettyPrinter() {
        return owner().getPrettyPrinter();
    };
}
