package com.jetpackduba.gitnuro.extensions

import org.eclipse.jgit.lib.Constants
import org.eclipse.jgit.lib.ObjectIdRef
import org.eclipse.jgit.lib.Ref

// Remotes can have slashes in the name, but we won't care about it, known issue
private const val REMOTE_PREFIX_LENGTH = 3
private const val LOCAL_PREFIX_LENGTH = 2

val Ref.simpleName: String
    get() {
        return when {
            this.name == Constants.HEAD -> {
                this.name
            }

            this.isRemote -> {
                val split = name.split("/")
                split.takeLast(split.size - REMOTE_PREFIX_LENGTH).joinToString("/")
            }

            else -> {
                val split = this.name.split("/")
                split.takeLast(split.size - LOCAL_PREFIX_LENGTH).joinToString("/")
            }
        }
    }

val Ref.simpleLogName: String
    get() {
        return when {
            this.name == Constants.HEAD -> {
                this.name
            }

            this.isRemote -> {
                name.replace("refs/remotes/", "")
            }

            else -> {
                val split = this.name.split("/")
                split.takeLast(split.size - LOCAL_PREFIX_LENGTH).joinToString("/")
            }
        }
    }

val Ref.remoteName: String
    get() {
        if (this.isLocal) {
            throw Exception("Trying to get remote name from a local branch")
        }
        val remoteWithoutPrefix = name.replace("refs/remotes/", "")
        val remoteName = remoteWithoutPrefix.split("/").firstOrNull()

        if (remoteName == null)
            throw Exception("Invalid remote name")
        else
            return remoteName
    }

val Ref.isBranch: Boolean
    get() {
        return this is ObjectIdRef.PeeledNonTag
    }

val Ref.isHead: Boolean
    get() {
        return this.name == Constants.HEAD
    }

val Ref.isTag: Boolean
    get() = this.name.startsWith(Constants.R_TAGS)

val Ref.isLocal: Boolean
    get() = !this.isRemote

val Ref.isRemote: Boolean
    get() = this.name.startsWith(Constants.R_REMOTES)

fun Ref.isSameBranch(otherRef: Ref?): Boolean {
    if (this.name == Constants.HEAD && otherRef == null)
        return true

    if (otherRef == null)
        return false

    return this.name == otherRef.name
}
