package codechicken.wirelessredstone.logic;

import net.minecraft.item.ItemStack;

import codechicken.core.ClientUtils;
import codechicken.lib.data.MCDataInput;
import codechicken.lib.vec.Cuboid6;
import codechicken.lib.vec.Vector3;
import codechicken.wirelessredstone.core.*;
import net.minecraft.util.StatCollector;

import static codechicken.lib.vec.Rotation.*;
import static codechicken.lib.vec.Vector3.*;

public class TransmitterPart extends TransceiverPart
{
    public static Cuboid6[] extensionBB = new Cuboid6[24];

    static {
        Cuboid6 base = new Cuboid6(7 / 16D, 1 / 8D, 2 / 8D, 9 / 16D, 7 / 8D, 3 / 8D);
        for (int s = 0; s < 6; s++)
            for (int r = 0; r < 4; r++)
                extensionBB[s << 2 | r] = base.copy().apply(sideOrientation(s, r).at(center));
    }

    @Override
    public ItemStack getItem() {
        return new ItemStack(WirelessRedstoneLogic.itemwireless, 1, 0);
    }

    @Override
    public void onNeighborChanged() {
        if (dropIfCantStay())
            return;

        int gettingPowered = getPoweringLevel();
        if (!active() && gettingPowered > 0)
            trySetState(true);
        else if (active() && gettingPowered == 0)
            trySetState(false);
    }

    private void trySetState(boolean on) {
        setActive(on);
        if (!disabled() || !on) {
            changeSpinState(on);
            RedstoneEther.server().setTransmitter(world(), x(), y(), z(), currentfreq, active());
        }
        updateChange();
    }

    private void changeSpinState(boolean on) {
        if (on && spinoffset < 0)//turning on
        {
            int time = (int) ((world().getTotalWorldTime() + spinoffset) % 100000);
            spinoffset = time;
        } else if (!on && spinoffset >= 0)//turning off
        {
            int time = (int) ((world().getTotalWorldTime() - spinoffset) % 100000);
            spinoffset = -time;
        }
    }

    @Override
    public void jamTile() {
        super.jamTile();
        updateChange();
    }

    @Override
    public void unjamTile() {
        super.unjamTile();
        addToEther();
        onNeighborChanged();
    }

    @Override
    public Vector3 getFocalPoint() {
        return new Vector3(0.3125, 0.24, 0).apply(rotationT());
    }

    @Override
    public Vector3 getPearlPos() {
        return new Vector3(0.5, 0.74 + getFloating() * 0.04, 5 / 16D);
    }

    @Override
    public double getPearlSpin() {
        if (spinoffset < 0)
            return RedstoneEther.getRotation(-spinoffset, currentfreq);

        return RedstoneEther.getRotation(ClientUtils.getRenderTime() - spinoffset, currentfreq);
    }

    public float getPearlLight() {
        float light = world().getLightBrightness(x(), y(), z());
        if ((deadmap & 1) == 1 || (deadmap == 0 && (disabled() || !active() || currentfreq == 0))) {
            light = (light + 1) * 0.25F;
        } else {
            light = (light + 1) * 0.5F;
        }
        return light;
    }

    @Override
    public void setFreq(int newfreq) {
        super.setFreq(newfreq);

        changeSpinState(active());
    }

    private void resetRotation() {
        spinoffset = active() ? 0 : -1;
    }

    @Override
    public void addToEther() {
        resetRotation();
        updateChange();
        RedstoneEther.server().setTransmitter(world(), x(), y(), z(), currentfreq, active() && !disabled());
    }

    @Override
    public void removeFromEther() {
        RedstoneEther.server().remTransmitter(world(), x(), y(), z(), currentfreq);
    }

    @Override
    public String getGuiName() {
        return StatCollector.translateToLocal("item.wrcbe_logic:wirelesspart|0.name");
    }

    @Override
    public String getType() {
        return "wrcbe-tran";
    }

    @Override
    public void read(MCDataInput packet) {
        super.read(packet);
        changeSpinState(active());
    }

    @Override
    public Cuboid6 getExtensionBB() {
        return extensionBB[shape()];
    }

    @Override
    public int modelId() {
        return 0;
    }
}