#!/bin/bash
#
# Toknot phpdoc creater ( http://toknot.com )
# @copyright  Copyright (c) 2011 - 2023 Toknot.com
# @license    http://toknot.com/LICENSE.txt New BSD License
# @link       http://toknot.com/download/phpdoc
#
# $ID:2020-07-16

#set your default locale language
LAN='zh'
OPT_NUM=$#
VERBOSE=0

function usage() {
    echo 'Usage phpdoc co [YOUR_PATH]  create local php doc viewer,创建本地文档项目'
    echo '      phpdoc up [YOUR_PATH]  update local php doc, 更新本地文档'
    echo '      phpdoc [YOUR_PATH]     update local php doc, 默认更新本地文档'
    echo '      phpdoc v [YOUR_PATH]   view local php doc 查看本地文档'
    echo ''
    echo 'Directory Structure'
    echo ' - doc-base   Tools for PHP documentation of svn repository'
    echo ' - en         English PHP documentation of svn repository'
    echo ' - '$LAN'         '$LAN' PHP documentation of svn repository'
    echo ' - phd        The PHP based Docbook Renderer of git repository'
    echo ' - web-php    The main PHP site at www.php.net of git repository'
    echo ' - res        some scripts for webroot'
    echo ' - webroot    The doc site this is local webroot directory'
    exit 255 
}

function checkcmd() {
    EXEC=$1
    if [ $# -eq 1 ];then
      EXEC="$1 --version"
      echo "Checking" $1
    else
      echo "Checking" $2 
    fi
    $EXEC > /dev/null
    RET=$?
    if [ $RET -gt 0 ];then
	if [ $# -eq 2 ];then
	echo "$2 not install"
	else
        echo "$1 command not found, need install or add environment path"
	fi
        exit 127
    fi
}

function checkrep() {
    if [ ! -e $2 ];then
	echo "$2 not exits"
        return 0
    fi
    echo "$2 is exits"
    cd $2
    echo "Exec: $1 $2"
    $1 > /dev/null
    RET=$?
    cd ..
    #repository status error
    if [ $RET -gt 0 ];then
	rm -rf ./$2
        return 0
    else
	echo "Exec: $3"
	cd $2
	$3
	cd ..
        #repository update error
  	if [ $? -gt 0 ];then
           rm -rf ./$2
           return 0
        fi
        return 1
    fi
  
}

function looprun() {
   cnt=1
   RET=1
   while [[ $RET -gt 0 && $cnt -lt 10 ]]
   do
    echo "Exec($cnt):$1"
	$1
	RET=$?
	cnt=$(($cnt+1))
	wait
   done
   return $RET
}

if [ $OPT_NUM -eq 0 ];then
    usage
fi
if [ $OPT_NUM -eq 1 ];then
    PHP_DOC_ROOT=$(realpath $1)
    OP='up'
    echo "Update $PHP_DOC_ROOT"
elif [ $OPT_NUM -ge 2 ];then
    OP=$1
    PHP_DOC_ROOT=$(realpath $2)
    echo "Update $PHP_DOC_ROOT"
fi

if [ $OP != 'up' ] && [ $OP != 'co' ] && [ $OP != 'v' ];then
    usage
fi

checkcmd php

if [ $OP == 'v' ];then
    if [ ! -e $PHP_DOC_ROOT/webroot ];then
	echo "$PHP_DOC_ROOT/webroot not exists";
	exit 220
    fi
    if [ ! -e $PHP_DOC_ROOT/webroot/.router.php ];then
	echo "$PHP_DOC_ROOT/webroot/.router.php not exists"
	exit 221
    fi
    if [ ! -e $PHP_DOC_ROOT/webroot/manual ];then
	echo "$PHP_DOC_ROOT/webroot/manual not exists"
	exit 223
    fi

    cd $PHP_DOC_ROOT/webroot
    echo "Please visit via web browser: http://127.0.0.1:8080";
    php -S 127.0.0.1:8080 .router.php > /dev/null 2>&1 &
    exit 0
fi
checkcmd "php -r extension_loaded('dom')?exit(0):exit(1);" 'PHP dom extension '
checkcmd "php -r extension_loaded('sqlite3')?exit(0):exit(1);" 'PHP sqlite3 extension '
#checkcmd svn
checkcmd git
checkcmd sed
checkcmd wget

PHP_CMD='php -d memory_limit=-1' 
UPDATE_PATH="webroot web-php phd doc-base en $LAN res"
for p in $UPDATE_PATH;do
if [ $OP == 'up' ] && [ ! -e $PHP_DOC_ROOT/$p ];then
    echo "Error: $PHP_DOC_ROOT/$p not exists, can not update"
    exit 127
fi
done
if [ $OP == 'co' ] && [ -e $PHP_DOC_ROOT ];then
    echo "Error:File $PHP_DOC_ROOT is exists, can not create doc"
    read -p "Whether force write[yes/no]:" CONFIRM
    if [ $CONFIRM == 'no' ];then
        exit 125
    fi
    if [ ! -e $PHP_DOC_ROOT/webroot ];then
	mkdir $PHP_DOC_ROOT/webroot
    fi 
    if [ ! -e $PHP_DOC_ROOT/res ];then
	mkdir $PHP_DOC_ROOT/res
    fi 

elif [ $OP == 'co' ] && [ ! -e $PHP_DOC_ROOT ];then
    mkdir $PHP_DOC_ROOT
    mkdir $PHP_DOC_ROOT/res
    mkdir $PHP_DOC_ROOT/webroot
fi

cd $PHP_DOC_ROOT
if [ $VERBOSE -eq 0 ];then
    GIT_QUIET='-q';
else
    GIT_QUIET='';
fi
if [ $OP == 'co' ]; then
    checkrep 'git status' web-php 'git pull '$GIT_QUIET
    RET=$?
    if [ $RET -eq 0 ];then
        looprun 'git clone https://github.com/php/web-php.git'
    fi
    checkrep 'git status' phd 'git pull '$GIT_QUIET
    RET=$?
    if [ $RET -eq 0 ];then 
        looprun 'git clone https://github.com/php/phd.git'
    fi
    #checkrep 'svn info' doc-base 'svn up -q'
    checkrep 'git status' doc-base 'git pull '$GIT_QUIET
    RET=$?
    if [ $RET -eq 0 ];then
        #looprun 'svn co -q http://svn.php.net/repository/phpdoc/doc-base/trunk doc-base'
	looprun 'git clone https://github.com/php/doc-base.git doc-base'
    fi
    #checkrep 'svn  info' en 'svn up -q'
    checkrep 'git status' en 'git pull '$GIT_QUIET
    RET=$?
    if [ $RET -eq 0 ];then
	looprun 'git clone https://github.com/php/doc-en.git en'
        #looprun 'svn co -q http://svn.php.net/repository/phpdoc/en/trunk en'
    fi
    checkrep 'git status' $LAN 'git pull '$GIT_QUIET
    RET=$?
    if [ $RET -eq 0 ];then
	looprun "git clone https://github.com/php/doc-$LAN.git $LAN"
        #looprun "svn co -q http://svn.php.net/repository/phpdoc/$LAN/trunk $LAN"
    fi
elif [ $OP == 'up' ];then
    echo "Upgrade Phd..."
    cd phd
    looprun 'git pull '$GIT_QUIET
    cd ..
    echo "Upgrade web-php..."
    cd web-php
    looprun 'git pull '$GIT_QUIET
    cd ..
    echo "Upgrade doc-base"
    cd doc-base
    looprun 'git pull '$GIT_QUIET
    cd ..
    echo "Upgrade doc-en"
    cd en
    looprun 'git pull '$GIT_QUIET
    echo "Upgrade doc-$LAN"
    cd ../$LAN
    looprun "git pull "$GIT_QUIET
fi

PHD_PATH="$PHP_DOC_ROOT/phd/render.php"

cd $PHP_DOC_ROOT
cd web-php
TAR_FILE="$PHP_DOC_ROOT/res/web-php.tar.gz"
if [ -e  $TAR_FILE ];then
   rm $TAR_FILE
fi
echo "Archive web-php"
git archive --format tar.gz --output "$TAR_FILE" master
cd ..

rm -rf $PHP_DOC_ROOT/webroot/*
tar xfz $TAR_FILE -C "$PHP_DOC_ROOT/webroot"

$PHP_CMD doc-base/configure.php --lang=en
$PHP_CMD $PHD_PATH -d doc-base/.manual.xml -o output/en -f php -P PHP

$PHP_CMD doc-base/configure.php --lang=zh
$PHP_CMD $PHD_PATH -d doc-base/.manual.xml -o output/zh -f php -P PHP

if [ ! -e ./webroot/manual ];then
   mkdir ./webroot/manual
fi

rm -rf ./webroot/manual/en

mv $PHP_DOC_ROOT/output/en/php-web $PHP_DOC_ROOT/webroot/manual/en
mv $PHP_DOC_ROOT/output/zh/php-web $PHP_DOC_ROOT/webroot/manual/$LAN

rm -rf $PHP_DOC_ROOT/output


echo "Create change.php for Change Language"
echo "<?php header(\"Location:{\$_GET['page']}\");" > $PHP_DOC_ROOT/webroot/manual/change.php

#echo "Replace jquery to local file"
if [ ! -e $PHP_DOC_ROOT/res/jquery.min.js ];then
wget http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.10.2.min.js -O $PHP_DOC_ROOT/res/jquery.min.js
fi
cp -f $PHP_DOC_ROOT/res/jquery.min.js $PHP_DOC_ROOT/webroot/js/jquery.min.js

sed -i '/ajax\.googleapis\.com.*jquery/d' $PHP_DOC_ROOT/webroot/include/footer.inc
sed -i 's/\$jsfiles = array(/&"jquery.min.js", /' $PHP_DOC_ROOT/webroot/include/footer.inc
echo '<?php
$uri = basename(trim($_SERVER["REQUEST_URI"],"/"));
$lang = empty($_COOKIE["LAST_LANG"]) ? 'en' : $_COOKIE["LAST_LANG"];
$filepath = "/manual/$lang/function.$uri.php";
if(!file_exists(__DIR__.$filepath)) {
    $filepath = "/manual/$lang/$uri.php";
} 
if(!file_exists(__DIR__.$filepath)) {
    $filepath = strtolower("/manual/$lang/class.$uri.php");
}
if(!file_exists(__DIR__.$filepath)) {
    $filepath = "/$uri.php";
}

if(!file_exists(__DIR__.$filepath)) {
    $url = "https://www.php.net".$_SERVER["REQUEST_URI"];
    echo "<html><body><b>File not Found at local</b><br>";
    echo "<b>Please visit:</b>&nbsp;<a href=\"$url\" target=\"_blank\">$url</a><body></html>";
    exit;
}

header("Location: $filepath");' > $PHP_DOC_ROOT/webroot/rediect.php

echo '<IfModule mod_rewrite.c> 
    RewriteEngine on 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_URI} !=/favicon.ico
    RewriteCond $1 !^distributions
    RewriteRule ^(.*)$ $1.php [L]
    RewriteRule ^distributions/(.*)$ https://www.php.net/distributions/$1
</IfModule>' >> $PHP_DOC_ROOT/webroot/.htaccess

if [ ! -e $PHP_DOC_ROOT/res/pregen_news ];then
wget -O $PHP_DOC_ROOT/res/pregen_news https://master.php.net/scripts/pregen_news
fi
if [ ! -e $PHP_DOC_ROOT/res/conference_teaser ];then
wget -O $PHP_DOC_ROOT/res/conference_teaser https://master.php.net/scripts/conference_teaser 
fi
$PHP_CMD -r '$root="'$PHP_DOC_ROOT'/webroot/";
include "'$PHP_DOC_ROOT'/res/pregen_news";
pregen_atom("$root/archive/archive.xml", "$root/feed.atom", "$root/include/pregen-news.inc");
include "'$PHP_DOC_ROOT'/res/conference_teaser";
pregenerate_conf_teaser("$root/feed.atom", "$root/include/pregen-confs.inc");'

echo "Web Root is: $PHP_DOC_ROOT/webroot"
echo "==================================================="
echo "Below is nginx rewrite config"
echo 
echo 'location / {'
echo '    try_files $uri  $uri/ /rediect.php;'
echo '}'


