package org.jboss.windup.decompiler.api;

import java.nio.file.Path;

/**
 * Contains the information needed to decompile a single class file.
 *
 * @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a>
 */
public class ClassDecompileRequest {
    private final Path rootDirectory;
    private final Path classFile;
    private final Path outputDirectory;

    /**
     * Create an instance with the given rootDirectory (eg, for a class named "com.foo.Example" in
     * "/path/to/com/foo/Example.class", this would be "/path/to") and the full path to the class file itself.
     * <p>
     * The resulting decompiled file will be placed in outputDirectory.
     */
    public ClassDecompileRequest(Path rootDirectory, Path classFile, Path outputDirectory) {
        this.rootDirectory = rootDirectory;
        this.classFile = classFile;
        this.outputDirectory = outputDirectory;
    }

    /**
     * Contains the root directory for this class file.
     */
    public Path getRootDirectory() {
        return rootDirectory;
    }

    /**
     * Contains the full path to the file itself.
     */
    public Path getClassFile() {
        return classFile;
    }

    /**
     * Contains the full path to the output directory (where the decompiled file will be placed).
     */
    public Path getOutputDirectory() {
        return outputDirectory;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        ClassDecompileRequest that = (ClassDecompileRequest) o;

        if (classFile != null ? !classFile.equals(that.classFile) : that.classFile != null) return false;
        if (outputDirectory != null ? !outputDirectory.equals(that.outputDirectory) : that.outputDirectory != null)
            return false;
        if (rootDirectory != null ? !rootDirectory.equals(that.rootDirectory) : that.rootDirectory != null)
            return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = rootDirectory != null ? rootDirectory.hashCode() : 0;
        result = 31 * result + (classFile != null ? classFile.hashCode() : 0);
        result = 31 * result + (outputDirectory != null ? outputDirectory.hashCode() : 0);
        return result;
    }
}
