/*
 * Copyright 2019 Web3 Labs Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations under the License.
 */
package org.web3j.gradle.plugin;

import java.io.File;
import javax.inject.Inject;

import org.web3j.codegen.SolidityFunctionWrapperGenerator;

public class GenerateContractWrapper implements Runnable {

    private final String contractName;

    private final File contractBin;
    private final File contractAbi;

    private final String outputDir;
    private final String packageName;

    private final int addressLength;

    private final boolean useNativeJavaTypes;

    @Inject
    public GenerateContractWrapper(
            final String contractName,
            final File contractBin,
            final File contractAbi,
            final String outputDir,
            final String packageName,
            final int addressLength,
            final boolean useNativeJavaTypes) {
        this.contractName = contractName;
        this.contractBin = contractBin;
        this.contractAbi = contractAbi;
        this.outputDir = outputDir;
        this.packageName = packageName;
        this.addressLength = addressLength;
        this.useNativeJavaTypes = useNativeJavaTypes;
    }

    @Override
    public void run() {
        final String typesFlag = useNativeJavaTypes ? "--javaTypes" : "--solidityTypes";

        SolidityFunctionWrapperGenerator.main(
                new String[] {
                    "--abiFile",
                    contractAbi.getAbsolutePath(),
                    "--binFile",
                    contractBin.getAbsolutePath(),
                    "--outputDir",
                    outputDir,
                    "--package",
                    packageName,
                    "--contractName",
                    contractName,
                    "--addressLength",
                    String.valueOf(addressLength),
                    typesFlag
                });
    }
}