package network.thunder.core.communication.objects.messages.impl.factories;

import network.thunder.core.communication.objects.messages.impl.message.lightningestablish.LNEstablishAMessage;
import network.thunder.core.communication.objects.messages.impl.message.lightningestablish.LNEstablishBMessage;
import network.thunder.core.communication.objects.messages.impl.message.lightningestablish.LNEstablishCMessage;
import network.thunder.core.communication.objects.messages.impl.message.lightningestablish.LNEstablishDMessage;
import network.thunder.core.communication.objects.messages.interfaces.factories.LNEstablishMessageFactory;
import network.thunder.core.database.objects.Channel;
import org.bitcoinj.core.Transaction;
import org.bitcoinj.crypto.TransactionSignature;

/**
 * Created by matsjerratsch on 03/12/2015.
 */
public class LNEstablishMessageFactoryImpl extends MesssageFactoryImpl implements LNEstablishMessageFactory {

    @Override
    public LNEstablishAMessage getEstablishMessageA (Channel channel) {
        LNEstablishAMessage message = new LNEstablishAMessage(
                channel.getKeyServer().getPubKey(),
                channel.getKeyServerA().getPubKey(),
                channel.getAnchorSecretHashServer(),
                channel.getAnchorRevocationHashServer(),
                channel.getInitialAmountClient(),
                channel.getInitialAmountServer());
        return message;
    }

    @Override
    public LNEstablishBMessage getEstablishMessageB (Channel channel, Transaction anchor) {
        LNEstablishBMessage message = new LNEstablishBMessage(
                channel.getKeyServer().getPubKey(),
                channel.getKeyServerA().getPubKey(),
                channel.getAnchorSecretHashServer(),
                channel.getAnchorRevocationHashServer(),
                anchor.getHash().getBytes(),
                channel.getInitialAmountServer()
        );

        return message;
    }

    @Override
    public LNEstablishCMessage getEstablishMessageC (Transaction anchor, TransactionSignature escapeSignature, TransactionSignature escapeFastSignature) {
        LNEstablishCMessage message = new LNEstablishCMessage(
                escapeSignature.encodeToBitcoin(),
                escapeFastSignature.encodeToBitcoin(),
                anchor.getHash().getBytes());
        return message;
    }

    @Override
    public LNEstablishDMessage getEstablishMessageD (TransactionSignature escapeSignature, TransactionSignature escapeFastSignature) {
        LNEstablishDMessage message = new LNEstablishDMessage(
                escapeSignature.encodeToBitcoin(),
                escapeFastSignature.encodeToBitcoin()
        );
        return message;
    }

}