package fr.openwide.core.wicket.more.link.descriptor.builder.impl.main;
import java.util.List;
import org.apache.wicket.Page;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.resource.ResourceReference;
import org.javatuples.Tuple;
import com.google.common.collect.ImmutableList;
import fr.openwide.core.wicket.more.link.descriptor.builder.impl.factory.BuilderTargetFactories;
import fr.openwide.core.wicket.more.link.descriptor.builder.impl.factory.IBuilderLinkDescriptorFactory;
import fr.openwide.core.wicket.more.link.descriptor.builder.impl.mapper.CoreFourParameterLinkDescriptorMapperImpl;
import fr.openwide.core.wicket.more.link.descriptor.builder.impl.parameter.LinkParameterTypeInformation;
import fr.openwide.core.wicket.more.link.descriptor.builder.state.main.IFourMappableParameterMainState;
import fr.openwide.core.wicket.more.link.descriptor.builder.state.parameter.chosen.IFourMappableParameterFourChosenParameterState;
import fr.openwide.core.wicket.more.link.descriptor.builder.state.parameter.chosen.IFourMappableParameterOneChosenParameterState;
import fr.openwide.core.wicket.more.link.descriptor.builder.state.parameter.chosen.IFourMappableParameterThreeChosenParameterState;
import fr.openwide.core.wicket.more.link.descriptor.builder.state.parameter.chosen.IFourMappableParameterTwoChosenParameterState;
import fr.openwide.core.wicket.more.link.descriptor.mapper.IFourParameterLinkDescriptorMapper;
import fr.openwide.core.wicket.more.markup.html.factory.IDetachableFactory;
final class FourMappableParameterMainStateImpl
<
TParam1, TParam2, TParam3, TParam4,
TEarlyTargetDefinitionLinkDescriptor,
TLateTargetDefinitionPageLinkDescriptor,
TLateTargetDefinitionResourceLinkDescriptor,
TLateTargetDefinitionImageResourceLinkDescriptor
>
extends AbstractOneOrMoreMappableParameterMainStateImpl
<
IFourMappableParameterMainState
<
TParam1, TParam2, TParam3, TParam4,
TEarlyTargetDefinitionLinkDescriptor,
TLateTargetDefinitionPageLinkDescriptor,
TLateTargetDefinitionResourceLinkDescriptor,
TLateTargetDefinitionImageResourceLinkDescriptor
>,
TEarlyTargetDefinitionLinkDescriptor,
TLateTargetDefinitionPageLinkDescriptor,
TLateTargetDefinitionResourceLinkDescriptor,
TLateTargetDefinitionImageResourceLinkDescriptor
>
implements IFourMappableParameterMainState
<
TParam1, TParam2, TParam3, TParam4,
TEarlyTargetDefinitionLinkDescriptor,
TLateTargetDefinitionPageLinkDescriptor,
TLateTargetDefinitionResourceLinkDescriptor,
TLateTargetDefinitionImageResourceLinkDescriptor
> {
FourMappableParameterMainStateImpl(
AbstractOneOrMoreMappableParameterMainStateImpl
<
?,
TEarlyTargetDefinitionLinkDescriptor,
TLateTargetDefinitionPageLinkDescriptor,
TLateTargetDefinitionResourceLinkDescriptor,
TLateTargetDefinitionImageResourceLinkDescriptor
> previousState,
LinkParameterTypeInformation<TParam4> addedParameterType) {
super(previousState, addedParameterType, 4);
}
private <TTarget, TLinkDescriptor> IFourParameterLinkDescriptorMapper<
TLinkDescriptor,
TParam1, TParam2, TParam3, TParam4
> createMapper(IBuilderLinkDescriptorFactory<TTarget, TLinkDescriptor> linkDescriptorFactory,
IDetachableFactory<? extends Tuple, ? extends IModel<? extends TTarget>> pageClassFactory,
List<Integer> parameterIndices) {
return new CoreFourParameterLinkDescriptorMapperImpl<>(
mapperLinkDescriptorFactory(
linkDescriptorFactory,
pageClassFactory, parameterIndices
)
);
}
private <TTarget, TLinkDescriptor> IFourParameterLinkDescriptorMapper<
TLinkDescriptor,
TParam1, TParam2, TParam3, TParam4
> createEarlyTargetDefinitionMapper(
BuilderTargetFactories<TLinkDescriptor, TTarget, ?, ?, ?> targetFactories) {
return createMapper(
targetFactories.getEarlyTargetDefinitionLinkDescriptorFactory(),
constantModelFactory(targetFactories.getEarlyTargetDefinitionTargetModel()),
ImmutableList.<Integer>of()
);
}
@SuppressWarnings({"rawtypes", "unchecked"})
private class FourParameterChosenParameterStateImpl
extends AbstractInternalChosenParameterStateImpl<FourParameterChosenParameterStateImpl>
implements IFourMappableParameterOneChosenParameterState,
IFourMappableParameterTwoChosenParameterState,
IFourMappableParameterThreeChosenParameterState,
IFourMappableParameterFourChosenParameterState {
@Override
protected FourParameterChosenParameterStateImpl thisAsTSelf() {
return this;
}
@Override
public IFourParameterLinkDescriptorMapper<
TLateTargetDefinitionPageLinkDescriptor,
TParam1, TParam2, TParam3, TParam4
> page(IDetachableFactory pageClassFactory) {
return createMapper(
getTargetFactories().getLateTargetDefinitionPageLinkDescriptorFactory(),
pageClassFactory, getParameterIndices()
);
}
@Override
public IFourParameterLinkDescriptorMapper<
TLateTargetDefinitionResourceLinkDescriptor,
TParam1, TParam2, TParam3, TParam4
> resource(IDetachableFactory resourceReferenceFactory) {
return createMapper(
getTargetFactories().getLateTargetDefinitionResourceLinkDescriptorFactory(),
resourceReferenceFactory, getParameterIndices()
);
}
@Override
public IFourParameterLinkDescriptorMapper<
TLateTargetDefinitionImageResourceLinkDescriptor,
TParam1, TParam2, TParam3, TParam4
> imageResource(IDetachableFactory resourceReferenceFactory) {
return createMapper(
getTargetFactories().getLateTargetDefinitionImageResourceLinkDescriptorFactory(),
resourceReferenceFactory, getParameterIndices()
);
}
}
private FourParameterChosenParameterStateImpl pickNone() {
return new FourParameterChosenParameterStateImpl();
}
@Override
public FourParameterChosenParameterStateImpl pickFirst() {
return pickNone().andFirst();
}
@Override
public FourParameterChosenParameterStateImpl pickSecond() {
return pickNone().andSecond();
}
@Override
public FourParameterChosenParameterStateImpl pickThird() {
return pickNone().andThird();
}
@Override
public FourParameterChosenParameterStateImpl pickFourth() {
return pickNone().andFourth();
}
@Override
public IFourParameterLinkDescriptorMapper<
TEarlyTargetDefinitionLinkDescriptor,
TParam1, TParam2, TParam3, TParam4
> build() {
return createEarlyTargetDefinitionMapper(getTargetFactories());
}
@Override
public IFourParameterLinkDescriptorMapper<
TLateTargetDefinitionPageLinkDescriptor,
TParam1, TParam2, TParam3, TParam4
> page(IModel<? extends Class<? extends Page>> pageClassModel) {
return pickNone().page(constantModelFactory(pageClassModel));
}
@Override
public IFourParameterLinkDescriptorMapper<
TLateTargetDefinitionResourceLinkDescriptor,
TParam1, TParam2, TParam3, TParam4
> resource(IModel<? extends ResourceReference> resourceReferenceModel) {
return pickNone().resource(constantModelFactory(resourceReferenceModel));
}
@Override
public IFourParameterLinkDescriptorMapper<
TLateTargetDefinitionImageResourceLinkDescriptor,
TParam1, TParam2, TParam3, TParam4
> imageResource(IModel<? extends ResourceReference> resourceReferenceModel) {
return pickNone().imageResource(constantModelFactory(resourceReferenceModel));
}
@Override
public IFourParameterLinkDescriptorMapper<
TLateTargetDefinitionPageLinkDescriptor,
TParam1, TParam2, TParam3, TParam4
> page(Class<? extends Page> pageClass) {
return page(Model.of(pageClass));
}
@Override
public IFourParameterLinkDescriptorMapper<
TLateTargetDefinitionResourceLinkDescriptor,
TParam1, TParam2, TParam3, TParam4
> resource(ResourceReference resourceReference) {
return resource(Model.of(resourceReference));
}
@Override
public IFourParameterLinkDescriptorMapper<
TLateTargetDefinitionImageResourceLinkDescriptor,
TParam1, TParam2, TParam3, TParam4
> imageResource(ResourceReference resourceReference) {
return imageResource(Model.of(resourceReference));
}
}