#!/system/xbin/bash

if test -e /data/scitd-debug; then
    set -x
    if echo $SHELLOPTS | grep xtrace; then
        export SHELLOPTS
    fi
fi

mkdir -p /sdcard/smartisan

die() {
    if test "${1:0:6}" = Error:; then
        echo "$@"
    else
        echo Error: "$@"
    fi
    exit -1
}

export -f die

log() {
    command log -t Scitd "$@"
}

delayed-exec() {
    (
        sleep 1
        "$@"
    ) >/dev/null 2>&1 &
    return 0;
}

export -f delayed-exec

check-ramdump-done() {
    local flag=$1
    local bytes=${#flag}
    if test "$CHECK_MAGIC" != done; then
        export CHECK_MAGIC=done
        if check-ramdump-done 'done ram dump to udisk' && test "$(dd if=/dev/block/bootdevice/by-name/udisk bs=1 count=8)" != 'Raw_Dmp!'; then
            return 1
        fi
    fi
    if test "$(dd if=/dev/block/bootdevice/by-name/factory bs=1 count=$bytes skip=31457280)" = "$flag"; then
        return 0;
    fi
    return 1;
}

export -f check-ramdump-done

function save-fatdump() {
    dir=/data/ramdump
    udisk_part=$(echo /dev/block/platform/*/by-name/udisk)
    mount -t vfat $udisk_part $dir
    if test ! -e $dir/1/DDRCS0.BIN; then
        umount $dir
        return 0
    fi

    if ! gnu-tar czf $savefile $dir/1 --checkpoint 2>&1; then
        echo "gnu-tar failed with $?: gnu-tar czf $savefile $dir/1 --checkpoint 2>&1;" >> ${savefile/%tgz/txt}
    fi

    if test -e /data/srem-debugging; then
        true
    else
        rm -r $dir/1
    fi
    umount $dir
}

function save-ramdump() {
    set -e
    if test -e /data/scitd-debug; then
        set -x
        exec 2>/sdcard/1.txt
    fi

    savedir=/sdcard/smartisan

    mkdir -p $savedir
    date=$(busybox date +%m-%d-%H-%M)
    savefile=$savedir/ramdump-$date.tgz

    if test -e /sdcard/smartisan/ramdump.desc; then
        mv /sdcard/smartisan/ramdump.desc ${savefile/%tgz/txt}
    fi


    if test "$(getprop persist.smartisan.fatdump)" = 1; then
        if (save-fatdump); then
           save-log ramdump-$date-syslog || true
        else
            (
                exit_val=$?
                echo;
                echo "Extract ramdump failed with $exit_val, here's the log"
                cat ${savefile/%tgz/log}
            ) >> ${savefile/%tgz/txt}
            save-log ramdump-$date-syslog || true
        fi
        exit 0
    fi


    logapk=$(
        if test -e /system/usr/share/log-crawler/LogCrawler.apk; then
            echo /system/usr/share/log-crawler/LogCrawler.apk
        else
            echo /data/PostFile-debug.apk # for test
        fi
          )
    if check-ramdump-done 'done ram dump to swap'; then
        dump_source=/data/s.wap
    elif check-ramdump-done 'done ram dump to udisk'; then
        dump_source=/dev/block/bootdevice/by-name/udisk
    else
        (
            log -t bhj There is no ramdump found?
            am startservice -n com.smartisan.sconf/.ToastService --es diplay 'There is no ramdump found.'
        ) || true
    fi
    if dalvikvm -cp ${logapk:-/data/PostFile-debug.apk} ExtractSwapDump $dump_source ${savefile/%tgz/zip} 2>> ${savefile/%tgz/log}; then
        save-log ramdump-$date-syslog || true
    else
        (
            exit_val=$?
            echo;
            echo "Extract ramdump failed with $exit_val, here's the log"
            cat ${savefile/%tgz/log}
        ) >> ${savefile/%tgz/txt}
    fi
    if test $dump_source = /dev/block/bootdevice/by-name/udisk; then
        echo XX | dd of=/dev/block/bootdevice/by-name/udisk
    fi
    echo XX | dd of=/dev/block/bootdevice/by-name/factory count=1 bs=4096 seek=7680 # 30M/4K dump flag
    echo XX | dd of=/dev/block/bootdevice/by-name/factory count=1 bs=4096 seek=5120 # 20M/4K
    if test "$(getprop persist.smartisan.swapdump)" = 1; then
        bash /etc/stcmd-scripts/enable-swap-dump
    fi
    return 0
}

function cpu-freq-temp-test() {
    if test -e /sdcard/current; then
        for x in $(seq 1 50); do
            if test -e /sdcard/current.$x; then
                continue
            else
                mv /sdcard/current /sdcard/current.$x
                break
            fi
        done
    fi
    if echo $SHELLOPTS | grep xtrace; then
        export DEBUG=true
    else
        exec >/dev/null 2>&1
    fi

    mkdir -p /sdcard/current

    if test /sdcard/smartisan/cpu-freq-temp-test.desc; then
        mv /sdcard/smartisan/cpu-freq-temp-test.desc /sdcard/current/purpose.txt;
    fi
    (sleep 5; stop)&

    for x in $(seq 0 3); do
        echo 300000 > /sys/devices/system/cpu/cpu$x/cpufreq/scaling_max_freq;
    done
    if test -e /etc/thermal-engine-8974.conf; then
        mount -o rw,remount /system
        rm /etc/thermal-engine-8974.conf;
        mount -o ro,remount /system
        stop thermal-engine
        start thermal-engine
    fi
    stop mpdecision
    for x in $(seq 0 3); do
        set +x
        while true; do true; done&
    done

    for freq in $(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies); do
        minfreq=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies|awk "{print \$1}")
        for x in $(seq 0 3); do
            echo 1 > /sys/devices/system/cpu/cpu$x/online;
            echo $freq > /sys/devices/system/cpu/cpu$x/cpufreq/scaling_max_freq;
            echo $minfreq > /sys/devices/system/cpu/cpu$x/cpufreq/scaling_min_freq;
        done;
        mkdir -p /sdcard/current/$freq;
        start=$(busybox date +%s)
        for n in $(seq 1 60); do
            for x in /sys/class/thermal/thermal_zone*; do
                cat $x/type;
                cat $x/temp;
            done | tee /sdcard/current/$freq/temp-$n.txt /sdcard/current/total.txt
            cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq |
                tee /sdcard/current/$freq/freq-$n.txt;
            echo round $n;
            sleep 2;
            time=$(busybox date +%s)
            if ((time - start > 120)); then
                break
            fi
        done;
    done
    reboot
}

function got-ramdump() {

    if test "$(getprop persist.smartisan.fatdump)" = 1; then
        dir=/data/ramdump
        mkdir -p $dir
        udisk_part=$(echo /dev/block/platform/*/by-name/udisk)
        if test ! -e "$udisk_part"; then
            return 1
        fi

        if test ! -e $udisk_part; then
            echo no ramdump
            return 1
        fi
        mount -t vfat $udisk_part $dir
        if test ! -e $dir/1/DDRCS0.BIN; then
            umount $dir
            echo no ramdump
            return 1
        fi
        umount $dir
        echo yes ramdump
        return 0
    fi

    if test -e /data/srem-debugging; then
        echo yes ramdump
        exit 0
    fi
    set -e

    if check-ramdump-done 'done ram dump'; then
        echo yes ramdump
        return 0
    fi
}

unpercentify() {
    echo -n "$@" | awk -F% '{
    for (i = 1; i <= NF; i++) {
        x = $(i);
        if (x < 0) {
            x += 256;
        }
        if ($(i)) printf("%c", x)
    }
}'
}

function start-logging() {
    setprop persist.smartisan.logs.enable 1
}

function stop-logging() {
    setprop persist.smartisan.logs.enable 0
}

function start-rem() {
    setprop persist.smartisan.devtest 1
}

function stop-rem() {
    setprop persist.smartisan.devtest 0
}

function save-log() {

    if test -e /data/scitd-debug; then
        set -x
        exec >/sdcard/1.txt 2>&1
    fi
    date=$1
    log date is $date
    shift
    mkdir -p /sdcard/smartisan/$date
    cd /sdcard/smartisan/$date
    exec > stderr.txt 2>&1
    log cd into /sdcard/smartisan/$date
    (
        getprop ro.build.date
        getprop ro.build.description
    ) > version.txt
    getprop > prop.txt

    ps > ps
    top -m 10 -n 1 > top
    dmesg > dmesg || true
    dumpsys > dumpsys || true
    uptime > uptime || true
    cat /proc/cmdline > cmdline || true
    cat /proc/meminfo >> meminfo || true
    cp -r /data/logs /data/anr /data/system/dropbox . || true
    logcat -v threadtime -d > system.logcat
    logcat -v threadtime -d -b radio > radio.logcat
    logcat -v threadtime -d -b events > events.logcat
    if test -e /sdcard/btsnoop_hci.log; then
        cp /sdcard/btsnoop_hci.log .
    fi || true
    set -- "$(cat /sdcard/smartisan/save-log-reason.txt)" "$(cat /sdcard/smartisan/save-log-png.txt)"
    log args are "$@"
    echo "$1" > ../$date.txt
    if test -e "$2" && test "$(dirname $(readlink -f "$2"))" = $(readlink -f /sdcard/Pictures/Screenshots); then
        cp "$2" ../$date.png
    fi
    cd ..;
    touch $date.tar.bz2.tmp
    am startservice -n com.bhj.setclip/.PutClipService --es picture $PWD/$date.tar.bz2.tmp
    am startservice -n com.bhj.setclip/.PutClipService --es picture $PWD/$date.txt
    am startservice -n com.bhj.setclip/.PutClipService --es picture $PWD/$date.png

    tar -cj -f $date.tar.bz2.tmp $date
    mv $date.tar.bz2.tmp $date.tar.bz2
    am startservice -n com.bhj.setclip/.PutClipService --es picture $PWD/$date.tar.bz2
    am startservice -n com.bhj.setclip/.PutClipService --es picture $PWD/$date.tar.bz2.tmp
    rm -r $date
}

log $0 "$@"
cmd=$1
shift


log "srem-helper: doing $cmd $@"
## start code-generator "^\\s *#"
#cat <<EOF
#case "\$cmd" in
#$(for x in $(grep ^function srem-helper|pn 2|grep -v ^die|perl -npe 's/\(.*//'); do
#cat <<XXX
#$x)
#$x "\$@"
#;;
#XXX
#done)
#*)
# if test -e /etc/stcmd-scripts/"\$cmd"; then
#     bash /etc/stcmd-scripts/"\$cmd" "\$@"
# else
#die Not implemented
#fi
#;;
#esac
#EOF
## end code-generator
## start generated code
case "$cmd" in
    save-ramdump)
        save-ramdump "$@"
        ;;
    cpu-freq-temp-test)
        cpu-freq-temp-test "$@"
        ;;
    got-ramdump)
        got-ramdump "$@"
        ;;
    start-logging)
        start-logging "$@"
        ;;
    stop-logging)
        stop-logging "$@"
        ;;
    start-rem)
        start-rem "$@"
        ;;
    stop-rem)
        stop-rem "$@"
        ;;
    save-log)
        save-log "$@"
        ;;
    *)
        if test -e /etc/stcmd-scripts/"$cmd"; then
            bash /etc/stcmd-scripts/"$cmd" "$@"
            ret=$?
            echo ret: $ret
        else
            echo "Error: $cmd is not implemented"
            echo ret: 255
        fi
        ;;
esac

## end generated code
log "srem-helper: finished $cmd $@"
