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

package com.hypixel.hytale.server.core.inventory.transaction;

import javax.annotation.Nullable;
import java.util.Iterator;
import java.util.function.Predicate;
import java.util.Objects;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import com.hypixel.hytale.server.core.inventory.container.ItemContainer;
import java.util.List;
import com.hypixel.hytale.server.core.inventory.ResourceQuantity;
import javax.annotation.Nonnull;

public class ResourceTransaction extends ListTransaction<ResourceSlotTransaction>
{
    @Nonnull
    private final ActionType action;
    @Nonnull
    private final ResourceQuantity resource;
    private final int remainder;
    private final int consumed;
    private final boolean allOrNothing;
    private final boolean exactAmount;
    private final boolean filter;
    
    public ResourceTransaction(final boolean succeeded, @Nonnull final ActionType action, @Nonnull final ResourceQuantity resource, final int remainder, final int consumed, final boolean allOrNothing, final boolean exactAmount, final boolean filter, @Nonnull final List<ResourceSlotTransaction> slotTransactions) {
        super(succeeded, slotTransactions);
        this.action = action;
        this.resource = resource;
        this.remainder = remainder;
        this.consumed = consumed;
        this.allOrNothing = allOrNothing;
        this.exactAmount = exactAmount;
        this.filter = filter;
    }
    
    @Nonnull
    public ActionType getAction() {
        return this.action;
    }
    
    @Nonnull
    public ResourceQuantity getResource() {
        return this.resource;
    }
    
    public int getRemainder() {
        return this.remainder;
    }
    
    public int getConsumed() {
        return this.consumed;
    }
    
    public boolean isAllOrNothing() {
        return this.allOrNothing;
    }
    
    public boolean isExactAmount() {
        return this.exactAmount;
    }
    
    public boolean isFilter() {
        return this.filter;
    }
    
    @Nonnull
    @Override
    public ResourceTransaction toParent(final ItemContainer parent, final short start, final ItemContainer container) {
        final List<ResourceSlotTransaction> slotTransactions = this.getList().stream().map(transaction -> transaction.toParent(parent, start, container)).collect((Collector<? super Object, ?, List<ResourceSlotTransaction>>)Collectors.toList());
        return new ResourceTransaction(this.succeeded(), this.action, this.resource, this.remainder, this.consumed, this.allOrNothing, this.exactAmount, this.filter, slotTransactions);
    }
    
    @Nullable
    @Override
    public ResourceTransaction fromParent(final ItemContainer parent, final short start, @Nonnull final ItemContainer container) {
        ResourceSlotTransaction transaction = null;
        final List<ResourceSlotTransaction> slotTransactions = this.getList().stream().map(transaction -> transaction.fromParent(parent, start, container)).filter(Objects::nonNull).collect((Collector<? super Object, ?, List<ResourceSlotTransaction>>)Collectors.toList());
        if (slotTransactions.isEmpty()) {
            return null;
        }
        boolean succeeded = false;
        final Iterator<ResourceSlotTransaction> iterator = slotTransactions.iterator();
        while (iterator.hasNext()) {
            transaction = iterator.next();
            if (transaction.succeeded()) {
                succeeded = true;
                break;
            }
        }
        return new ResourceTransaction(succeeded, this.action, this.resource, this.remainder, this.consumed, this.allOrNothing, this.exactAmount, this.filter, slotTransactions);
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "ResourceTransaction{action=" + String.valueOf(this.action) + ", resource=" + String.valueOf(this.resource) + ", remainder=" + this.remainder + ", consumed=" + this.consumed + ", allOrNothing=" + this.allOrNothing + ", exactAmount=" + this.exactAmount + ", filter=" + this.filter + "} " + super.toString();
    }
}
