package at.petrak.hexcasting.fabric.cc;

import at.petrak.hexcasting.api.player.FlightAbility;
import at.petrak.hexcasting.api.utils.HexUtils;
import dev.onyxstudios.cca.api.v3.component.Component;
import net.minecraft.core.Registry;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerPlayer;
import org.jetbrains.annotations.Nullable;

public class CCFlight implements Component {
    public static final String
        TAG_ALLOWED = "allowed", // Fake: use this as a null sentinel
        TAG_TIME_LEFT = "time_left",
        TAG_DIMENSION = "dimension",
        TAG_ORIGIN = "origin",
        TAG_RADIUS = "radius";

    private final ServerPlayer owner;
    @Nullable
    private FlightAbility flight = null;

    public CCFlight(ServerPlayer owner) {
        this.owner = owner;
    }


    @Nullable
    public FlightAbility getFlight() {
        return flight;
    }

    public void setFlight(FlightAbility flight) {
        this.flight = flight;
    }

    @Override
    public void readFromNbt(CompoundTag tag) {
        var allowed = tag.getBoolean(TAG_ALLOWED);
        if (!allowed) {
            this.flight = null;
        } else {
            var timeLeft = tag.getInt(TAG_TIME_LEFT);
            var dim = ResourceKey.create(Registry.DIMENSION_REGISTRY,
                new ResourceLocation(tag.getString(TAG_DIMENSION)));
            var origin = HexUtils.vecFromNBT(tag.getLongArray(TAG_ORIGIN));
            var radius = tag.getDouble(TAG_RADIUS);
            this.flight = new FlightAbility(timeLeft, dim, origin, radius);
        }
    }

    @Override
    public void writeToNbt(CompoundTag tag) {
        tag.putBoolean(TAG_ALLOWED, this.flight != null);
        if (this.flight != null) {
            tag.putInt(TAG_TIME_LEFT, this.flight.timeLeft());
            tag.putString(TAG_DIMENSION, this.flight.dimension().location().toString());
            tag.put(TAG_ORIGIN, HexUtils.serializeToNBT(this.flight.origin()));
            tag.putDouble(TAG_RADIUS, this.flight.radius());
        }
    }
}
