#!/bin/sh

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

#---------------- variables --------------------------
version="1.0.0"
export 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 -------
RESET="\033[0m"
GREEN="\033[0;32m"
RED="\033[0;31m"
BRED="\033[1;31m"
YELLOW="\033[1;33m"
BWHITE="\033[1;37m"
BBLUE="\033[1;34m"
BGREEN="\033[1;32m"
#--------------------

#------------ check status function ------------
check() {
    if [ $1 -ne 0 ]; then
        printf "$BBLUE**$BWHITE $2 [$BRED ERROR $BWHITE]\n$RESET"
        exit $1
    fi
    printf "$BBLUE**$BWHITE $2 [$BGREEN SUCCESS $BWHITE]\n$RESET"
}
#-----------------------------------------------

#---------------- check root priveleges function ------------------------
checkroot() {
    if [[ $(id -u) != 0 ]]; then
        printf "$BBLUE**$BWHITE You must be root [$BRED ERROR $BWHITE]\n$RESET"
        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
}
a() {
    add $*
}
#------------------------------------------------------------------------

#-------------------- download package without install function ---------
down() {
    if [[ ! $1 ]]; then
        help
        exit 0
    fi
    servers=$(/usr/bin/cat $repofile)
    check $? "Read repositories"
    for i in $servers; do
        serverdir=$(echo $i | sed -e "/http:\/\//s///")
        serverdir=$(echo $i | sed -e "/ftp:\/\//s///")
        repoquery=$(/usr/bin/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
                    check $? "Download package"
                    # 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 "$BBLUE**$BWHITE Can't find package $1 [$BRED ERROR $BWHITE]\n$RESET"
    exit 1
}
download() {
    down $1
}
#------------------------------------------------------------------------

#-------------------- unpack local package archive ----------------------
unpack() {
    packagename=$(echo $1 | sed -e "/.gz/s///")
    packagename=${packagename#*pkg/}
    printf "$YELLOW**$GREEN Installing ${packagename%.pkg*}\n$RESET"
    installed=$(/usr/bin/cat $packagesqueryfile | grep ${packagename%.pkg*})
    check $? "Read $packagesqueryfile"
    if [[ "$installed" != "" ]]; then
        printf "$YELLOW**$RESET Package already installed:$YELLOW reinstalling\n$RESET"
    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 -r ./* $rootdir/
    if [ -f $rootdir/post_install ]; then
        rm $rootdir/post_install
    fi
    if [ -f $rootdir/tmp/$packagename/post_install ]; then
        printf "$YELLOW**$GREEN post_install script ${packagename%.pkg*}\n$RESET"
        /usr/bin/sh -c $rootdir/tmp/$packagename/post_install &> /dev/null
    fi
    if [[ "$(/usr/bin/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"
}
u() {
    unpack $1
}
#------------------------------------------------------------------------

#------------------ 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 "$BBLUE**$BWHITE package not installed ($i) [$BRED ERROR $BWHITE]\n$RESET"
            exit 1
        fi
        for file in $(/usr/bin/cat $installedpackagesdir/$i.pkg/list); do
            rm -v $rootdir/$file
        done
        # rm -v $rootdir/$(/usr/bin/cat $installedpackagesdir/$i.pkg/list)
        rm -rv $installedpackagesdir/$i.pkg &> /dev/null
        sed -i "/$i/d" $packagesqueryfile
        printf "$YELLOW**$GREEN delete $i successful\n$RESET"
    done
}
d() {
    del $*
}
#------------------------------------------------------------------------

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

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

#--------------------- 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=$(/usr/bin/cat $repofile)
    for i in $servers; do
        serverdir=$(echo $i | sed -e "/http:\//s///")
        serverdir=$(echo $i | sed -e "/ftp:\//s///")
        mkdir -p $reposquerydir/$serverdir &> /dev/null
        wget $i/query -O $reposquerydir/$serverdir/query &> /dev/null
    done
}
#------------------------------------------------------------------------

#----------------- search package in repo function ----------------------
search() {
    servers=$(/usr/bin/cat $repofile)
    if [[ ! $1 ]]; then
        for i in $servers; do
            serverdir=$(echo $i | sed -e "/http:\/\//s///")
            repoquery=$(/usr/bin/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=$(/usr/bin/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|del|d)
        "$1" $*
        ;;
    query|q|help|sync|clear|search|list|l|unpack|u|down|download)
        "$1" $2
        ;;
    *)
        help
        ;;
esac
