// 
// Decompiled by Procyon v0.6.0
// 

package com.hypixel.hytale.server.npc.corecomponents.timer;

import java.util.function.Supplier;
import com.hypixel.hytale.server.npc.sensorinfo.InfoProvider;
import com.hypixel.hytale.component.ComponentAccessor;
import java.time.Instant;
import com.hypixel.hytale.server.core.modules.time.WorldTimeResource;
import com.hypixel.hytale.component.Store;
import com.hypixel.hytale.server.npc.role.Role;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.server.npc.corecomponents.builders.BuilderSensorBase;
import com.hypixel.hytale.server.npc.asset.builder.BuilderSupport;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.npc.corecomponents.timer.builders.BuilderSensorAlarm;
import com.hypixel.hytale.server.npc.util.Alarm;
import com.hypixel.hytale.server.npc.corecomponents.SensorBase;

public class SensorAlarm extends SensorBase
{
    protected final Alarm alarm;
    protected final State state;
    protected final boolean clear;
    
    public SensorAlarm(@Nonnull final BuilderSensorAlarm builder, @Nonnull final BuilderSupport support) {
        super(builder);
        this.alarm = builder.getAlarm(support);
        this.state = builder.getState(support);
        this.clear = builder.isClear(support);
    }
    
    @Override
    public boolean matches(@Nonnull final Ref<EntityStore> ref, @Nonnull final Role role, final double dt, @Nonnull final Store<EntityStore> store) {
        if (!super.matches(ref, role, dt, store)) {
            return false;
        }
        switch (this.state.ordinal()) {
            case 0: {
                final WorldTimeResource worldTimeResource = store.getResource(WorldTimeResource.getResourceType());
                return this.alarm.isSet() && !this.alarm.hasPassed(worldTimeResource.getGameTime());
            }
            case 1: {
                return !this.alarm.isSet();
            }
            case 2: {
                final WorldTimeResource worldTimeResource = store.getResource(WorldTimeResource.getResourceType());
                final boolean passed = this.alarm.hasPassed(worldTimeResource.getGameTime());
                if (passed && this.clear) {
                    this.alarm.set(ref, null, store);
                }
                return passed;
            }
            default: {
                return false;
            }
        }
    }
    
    @Override
    public InfoProvider getSensorInfo() {
        return null;
    }
    
    public enum State implements Supplier<String>
    {
        SET("Set"), 
        UNSET("Not set"), 
        PASSED("Passed");
        
        private final String asText;
        
        private State(final String text) {
            this.asText = text;
        }
        
        public String asText() {
            return this.asText;
        }
        
        @Override
        public String get() {
            return this.asText;
        }
    }
}
