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

package com.hypixel.hytale.server.core.modules.accesscontrol.ban;

import com.hypixel.hytale.common.util.StringUtil;
import java.time.temporal.Temporal;
import java.time.Duration;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import com.google.gson.JsonParseException;
import java.util.UUID;
import javax.annotation.Nonnull;
import com.google.gson.JsonObject;
import java.time.Instant;

public class TimedBan extends AbstractBan
{
    private final Instant expiresOn;
    
    @Nonnull
    public static TimedBan fromJsonObject(@Nonnull final JsonObject object) throws JsonParseException {
        try {
            final UUID target = UUID.fromString(object.get("target").getAsString());
            final UUID by = UUID.fromString(object.get("by").getAsString());
            final Instant timestamp = Instant.ofEpochMilli(object.get("timestamp").getAsLong());
            final Instant expiresOn = Instant.ofEpochMilli(object.get("expiresOn").getAsLong());
            String reason = null;
            if (object.has("reason")) {
                reason = object.get("reason").getAsString();
            }
            return new TimedBan(target, by, timestamp, expiresOn, reason);
        }
        catch (final Throwable throwable) {
            throw new JsonParseException(throwable);
        }
    }
    
    public TimedBan(final UUID target, final UUID by, final Instant timestamp, final Instant expiresOn, final String reason) {
        super(target, by, timestamp, reason);
        this.expiresOn = expiresOn;
    }
    
    @Override
    public boolean isInEffect() {
        return this.expiresOn.isAfter(Instant.now());
    }
    
    @Nonnull
    @Override
    public String getType() {
        return "timed";
    }
    
    public Instant getExpiresOn() {
        return this.expiresOn;
    }
    
    @Nonnull
    @Override
    public CompletableFuture<Optional<String>> getDisconnectReason(final UUID uuid) {
        final Duration timeRemaining = Duration.between(Instant.now(), this.expiresOn);
        final StringBuilder message = new StringBuilder("You are temporarily banned for ").append(StringUtil.humanizeTime(timeRemaining)).append('!');
        this.reason.ifPresent(s -> message.append(" Reason: ").append(s));
        return CompletableFuture.completedFuture(Optional.of(message.toString()));
    }
    
    @Nonnull
    @Override
    public JsonObject toJsonObject() {
        final JsonObject object = super.toJsonObject();
        object.addProperty("expiresOn", this.expiresOn.toEpochMilli());
        return object;
    }
}
