package org.kohsuke.github;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

/**
 * Provides information for Git Trees https://developer.github.com/v3/git/trees/
 *
 * @author Daniel Teixeira - https://github.com/ddtxra
 * @see GHTree
 */
public class GHTreeEntry {
    /* package almost final */GHTree tree;

    private String path, mode, type, sha, url;
    private long size;

    /**
     * Get the path such as "subdir/file.txt"
     *
     * @return the path
     */
    public String getPath() {
        return path;
    }

    /**
     * Get mode such as 100644
     *
     * @return the mode
     */
    public String getMode() {
        return mode;
    }

    /**
     * Gets the size of the file, such as 132
     *
     * @return The size of the path or 0 if it is a directory
     */
    public long getSize() {
        return size;
    }

    /**
     * Gets the type such as: "blob", "tree", etc.
     *
     * @return The type
     */
    public String getType() {
        return type;
    }

    /**
     * SHA1 of this object.
     *
     * @return the sha
     */
    public String getSha() {
        return sha;
    }

    /**
     * API URL to this Git data, such as https://api.github.com/repos/jenkinsci
     * /jenkins/git/commits/b72322675eb0114363a9a86e9ad5a170d1d07ac0
     *
     * @return the url
     */
    public URL getUrl() {
        return GitHubClient.parseURL(url);
    }

    /**
     * If this tree entry represents a file, then return its information. Otherwise null.
     *
     * @return the gh blob
     * @throws IOException
     *             the io exception
     */
    public GHBlob asBlob() throws IOException {
        if (type.equals("blob"))
            return tree.repo.getBlob(sha);
        else
            return null;
    }

    /**
     * If this tree entry represents a file, then return its content. Otherwise null.
     *
     * @return the input stream
     * @throws IOException
     *             the io exception
     */
    public InputStream readAsBlob() throws IOException {
        if (type.equals("blob"))
            return tree.repo.readBlob(sha);
        else
            return null;
    }

    /**
     * If this tree entry represents a directory, then return it. Otherwise null.
     *
     * @return the gh tree
     * @throws IOException
     *             the io exception
     */
    public GHTree asTree() throws IOException {
        if (type.equals("tree"))
            return tree.repo.getTree(sha);
        else
            return null;
    }
}
