package carpetextra.mixins;

import carpetextra.CarpetExtraSettings;
import net.minecraft.block.Blocks;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.decoration.AbstractDecorationEntity;
import net.minecraft.entity.decoration.ItemFrameEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.world.World;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

@Mixin(ItemFrameEntity.class)
public abstract class ItemFrameEntity_comparatorReadsClockMixin extends AbstractDecorationEntity
{
    public ItemFrameEntity_comparatorReadsClockMixin(EntityType<? extends ItemFrameEntity> entityType_1, World world_1) {
        super(entityType_1, world_1);
    }

    @Shadow
    public abstract ItemStack getHeldItemStack();

    @Inject(method = "getComparatorPower", at =  @At("HEAD"),cancellable = true)
    private void giveClockPower(CallbackInfoReturnable<Integer> cir) {
        if(CarpetExtraSettings.comparatorReadsClock && this.getHeldItemStack().getItem() == Items.CLOCK) {
            int power;
            //Every 1500 ticks, increase signal strength by one
            power = (int)(this.world.getTimeOfDay() % 24000) / 1500;
            //in case negative time of day every happens, make comparator output the according positive value
            if(power < 0)
                power = power + 16;
            cir.setReturnValue(power);
            cir.cancel();
        }
    }

    private boolean firstTick = true;
    public void tick() {
        if(CarpetExtraSettings.comparatorReadsClock && this.getHeldItemStack().getItem() == Items.CLOCK) {
            //This doesn't handle time set commands yet

            //Every 1500 ticks, increase signal strength by one, so update comparators exactly then
            if(this.world.getTimeOfDay() % 1500 == 0 || firstTick) {
                firstTick = false;
                if(this.attachmentPos != null) {
                    this.world.updateHorizontalAdjacent(this.attachmentPos, Blocks.AIR);
                }
            }
        }
        super.tick();
    }
}