#!/bin/sh

########## ####      ####
########## ####      ####
##      ## ##  ##  ##  ##
##      ## ##  ##  ##  ##
########## ##    ##    ## - PACKAGE MANAGER FOR SIMPLE LINUX
########## ##    ##    ## - AUTHOR -- TOLA MIRONCENKO
##         ##          ##
##         ##          ##
##         ##          ##
##         ##          ##

#---------------- variables --------------------------
rootdir=/
repofile=$rootdir/etc/pm/repo
packagesqueryfile=$rootdir/usr/share/pm/query
reposquerydir=$rootdir/usr/share/pm/repos
cachedpkgdir=$rootdir/var/cache/pm/pkg
installedpackagesdir=$rootdir/usr/share/pm/packages
#-----------------------------------------------------

#----- colors -------
. $rootdir/usr/lib/init/colors.sh
#--------------------

#---------------- check root priveleges function ------------------------
checkroot() {
    if [[ $(id -u) != 0 ]]; then
        printf "$YELLOW**$BRED error:$RESET you must be root\n"
        exit 1
    fi
}

checkroot
#------------------------------------------------------------------------

#----------------- add(install) package function ------------------------
add() {
    if [[ "$1" == "" ]]; then
        help
        exit 0
    fi
    for i in $*; do
        if [[ "$i" == "add" ]]; then
            continue
        fi
        
    done
    for i in $*; do
        if [[ "$i" == "add" ]]; then
            continue
        fi
        down $i
    done
    for i in $*; do
        if [[ "$i" == "add" ]]; then
            continue
        fi
        unpack $cachedpkgdir/$i.pkg.gz
    done
}
#------------------------------------------------------------------------

#-------------------- download package without install function ---------
down() {
    if [[ ! $1 ]]; then
        help
        exit 0
    fi
    servers=$(cat $repofile)
    for i in $servers; do
        serverdir=$(echo $i | sed -e "/http:\/\//s///")
        repoquery=$(cat $reposquerydir/$serverdir/query | sed -e '/.pkg.gz/s///')
        for j in $repoquery; do
            if [[ $j == $1 ]]; then
                if [ ! -f $cachedpkgdir/$1.pkg.gz ]; then
                    printf "$YELLOW**$RESET Downloading $YELLOW$serverdir: $Bwhite$j\n$RESET"
                    wget $i/$1.pkg.gz -P $cachedpkgdir
                    if [[ "$?" == "0" ]]; then
                        printf "$YELLOW**$GREEN successful downloaded $1\n$RESET"
                        return
                    else 
                        printf "$YELLOW**$RED error:$RESET can't download package\n"
                        exit 1
                    fi
                else
                    printf "$YELLOW**$GREEN successful downloaded $1\n$RESET"
                    return
                fi 
                # exit 0                
            fi
        done
    done
    printf "$YELLOW**$RED error:$RESET can't find package $1\n"
    exit 1
}
#------------------------------------------------------------------------

#-------------------- unpack local package archive ----------------------
unpack() {
    packagename=$(echo $1 | sed -e "/.gz/s///")
    packagename=${packagename#*pkg/}
    printf "$YELLOW**$GREEN Installing ${packagename%.pkg*}\n$RESET"
    if [[ "$(cat $packagesqueryfile | grep ${packagename%.pkg*})" != "" ]]; then
        printf "$YELLOW**$RESET Package already installed:$YELLOW reinstalling\n"
    fi
    tar -xvf $1 -C $rootdir/tmp &> /dev/null
    cd $rootdir/tmp/$packagename
    mkdir $installedpackagesdir/$packagename &> /dev/null
    mv -v list $installedpackagesdir/$packagename &> /dev/null
    cp -rv ./* $rootdir &> /dev/null
    if [ -f $rootdir/tmp/$packagename/post_install ]; then
        sh -c $rootdir/tmp/$packagename/post_install
    fi
    if [[ "$(cat $packagesqueryfile | grep ${packagename%.pkg*})" == "" ]]; then
        echo ${packagename%.pkg*} >> $packagesqueryfile
    fi
    rm -rv $rootdir/tmp/$packagename &> /dev/null
    printf "$YELLOW**$GREEN Installed ${packagename%.pkg*} successful\n$RESET"
}
#------------------------------------------------------------------------

#------------------ delete package function -----------------------------
del() {
    printf "$YELLOW**$GREEN deleting\n$RESET"
    for i in $*; do
        if [[ "$i" == "del" ]]; then
            continue
        fi
        printf "$YELLOW**$GREEN deleting $i\n$RESET"
        if [ ! -f $installedpackagesdir/$i.pkg/list ]; then
            printf "$YELLOW**$BRED error:$RESET package not installed\n"
            exit 0
        fi
        rm -v $rootdir/$(cat $installedpackagesdir/$i.pkg/list) &> /dev/null
        rm -rv $installedpackagesdir/$i.pkg &> /dev/null
        sed -i "/$i/d" $packagesqueryfile
        printf "$YELLOW**$GREEN delete $i successful\n$RESET"
    done
}
#------------------------------------------------------------------------

#------------------- list files in package function ---------------------
list() {
    if [[ "$1" == "" ]]; then
        help
        exit 0
    fi
    if [[ "$(cat $packagesqueryfile | grep $1)" == "" ]]; then
        printf "$YELLOW**$BRED error:$RESET package is not installed\n"
        exit 1
    fi
    filelist=$(cat $installedpackagesdir/$1.pkg/list)
    for i in $filelist; do
        printf "$YELLOW$1: $BWHITE$i$RESET\n"
    done
}
#------------------------------------------------------------------------

#------------------- show installed packages function -------------------
query() {
    packagesquery=$(cat $packagesqueryfile)
    if [[ "$packagesquery" == "" ]]; then
        printf "$YELLOW**$BWHITE No installed packages\n"
        exit 0
    fi
    printf "$packagesquery\n"
}
#------------------------------------------------------------------------

#--------------------- show help function -------------------------------
help() {
    printf "
        $YELLOW**$GREEN pm usage$RESET :
        $BWHITE pm add [package name] - download and install from repository
         pm unpack [/path/to/package/archive] - unpack(install) from local package archive
         pm down [package name] - download package from repository without install
         pm del [package name] - delete package
         pm list [package name] - list files in package
         pm search [package name] - search package in repository
         pm query - show installed packages
         pm help - this help message
         pm clear - clear all package archives from cached packages directory
         pm sync - synchronize repository

        $YELLOW**$GREEN examples$RESET :
        $BWHITE pm add dnsmasq
         pm unpack ./dnsmasq.pkg.gz
         pm down dnsmasq
         pm search dnsmasq
         pm help
         pm clear
         pm sync
         pm del dnsmasq
         pm list dnsmasq
         pm query
    \n$RESET"
}
#------------------------------------------------------------------------

#------------------- sync repo function ---------------------------------
sync() {
    servers=$(cat $repofile)
    for i in $servers; do
        serverdir=$(echo $i | sed -e "/http:\//s///")
        mkdir $reposquerydir/$serverdir &> /dev/null
        wget $i/query -O $reposquerydir/$serverdir/query &> /dev/null
    done
}
#------------------------------------------------------------------------

#----------------- search package in repo function ----------------------
search() {
    servers=$(cat $repofile)
    if [[ ! $1 ]]; then
        for i in $servers; do
            serverdir=$(echo $i | sed -e "/http:\/\//s///")
            repoquery=$(cat $reposquerydir/$serverdir/query | sed -e '/.pkg.gz/s///')
            for j in $repoquery; do
                printf "$YELLOW$serverdir: $BWHITE$j\n$RESET"
            done
        done
        exit 0
    fi

    for i in $servers; do
        serverdir=$(echo $i | sed -e "/http:\/\//s///")
        repoquery=$(cat $reposquerydir/$serverdir/query | sed -e '/.pkg.gz/s///')
        for j in $repoquery; do
            if [[ $j == $1 ]]; then
                printf "$YELLOW$serverdir: $BWHITE$j\n$RESET"
                exit 0
            fi
        done
    done
    printf "$YELLOW**$RED error:$RESET can't find package ($1)\n"
}
#------------------------------------------------------------------------

#------------------- clear cached packages directory --------------------
clear() {
    rm -v $cachedpkgdir/*
}
#------------------------------------------------------------------------

case "$1" in 
    add|a|-a)
        add $*
        ;;
    down|download)
        down $2
        ;;
    unpack|u|-u)
        unpack $2
        ;;
    del|d|-d)
        del $*
        ;;
    list|l|-l)
        list $2
        ;;
    query|q|-q)
        query
        ;;
    help)
        help
        ;;
    sync)
        sync
        ;;
    search)
        search $2
        ;;
    clear)
        clear
        ;;
    *)
        help
        ;;
esac
