#!/bin/bash


GLOBAL_IP=$1
BOARD=$2

T_TAGTE=
T_JSON=
T_MODE=
BASE_URL=http://${GLOBAL_IP}:7100
TMP_PATH="/tmp/eda-common"
# 九宫格模式
TEST_MODE_NINE="0"
TEST_RETRY=3
dpkg -l | grep ubuntu-desktop  > /dev/null
DESKTOP=$?

function die(){
    local msg=$*
    echo_error "${msg}"
    exit 1
}

function t_pass(){
    echo -e "\e[32;20m"
    echo " #####     ##     ####    ####"
    echo " #    #   #  #   #       #"
    echo " #    #  #    #   ####    ####"
    echo " #####   ######       #       #"
    echo " #       #    #  #    #  #    #"
    echo " #       #    #   ####    ####"
    echo -e "\e[0m"
}

function echo_msg(){
    local msg=$*
    echo -e "${msg}"
}

function echo_error(){
    local msg=$*
    echo_msg "\033[31m[ERROR]: ${msg}\033[0m"
}

function echo_info(){
    local msg=$*
    echo_msg "[INFO]: ${msg}"
}

function usage(){
    echo "$0 <board> <server_ip_address> <mode> <retry>"
    echo "Example: $0 192.168.8.213 cm4sen 0 3"
    echo "Availiable Board names:"
    echo "hmi3010-101c"
    echo "cm4sen"
    echo "ipc2110"
    echo "ipc2630"
    exit 2
}

function config_uart(){
    grep -q "console=serial0,115200" /boot/firmware/cmdline.txt
    if [ $? -eq 0 ];then
        sudo sed -i "s/console=serial0,115200//" /boot/firmware/cmdline.txt
    fi
}

function kernel_change(){
    local version="$1"
    curl -s 'https://apt.edatec.cn/downloads/20250103/kernel-change-ubuntu.sh' | sudo bash -s ${version}
}

function install_debs_local(){
    local tmp_dir="${TMP_PATH}/debs/"
    local t_install=0
    mkdir -p $tmp_dir

    # apt install -y gpiod

    local t_bit=$(getconf LONG_BIT)
    local arch="arm64"
    if [ "${t_bit}" = "32" ];then
        arch="armhf"
    fi
    for t_deb in $*
    do
        t_install=1
        if [[ ${t_deb} == ed-linux-image* ]] && [[ ${arch} == armhf ]];then
            echo $t_deb | grep -q 2712
            if [ $? -eq 0 ];then
                t_deb=${t_deb/2712/v8}
            fi
            wget "${BASE_URL}/debs/arm64/${t_deb}" -O ${tmp_dir}${t_deb}.deb
        else
            wget "${BASE_URL}/debs/${arch}/${t_deb}" -O ${tmp_dir}${t_deb}.deb
        fi
    done
    if [ ${t_install} -eq 1 ];then
        cd $tmp_dir
        apt install --reinstall -y ./*.deb
        if [ $? -ne 0 ];then
            echo -e "\e[31m Debs install failed! \e[0m"
            rm -rf $tmp_dir
            exit 1
        fi
        cd -
        rm -rf $tmp_dir
    fi
}

function install_debs_apt(){
    local debs=$*

    for deb in ${debs};do
        sudo apt install -y ${deb}
        [ $? -eq 0 ] || echo_error "Install ${deb} Failed!"
    done
}

function install_hmi_debs(){
    install_debs_local linux-modules-6.8.0-1005-raspi linux-image-6.8.0-1005-raspi
    kernel_change "6.8.0-1005-raspi"
    [ $? -eq 0 ] || die "Changing Kernel Failed!"
}

function install_auto_test(){
    
    if [ $DESKTOP -eq 0 ];then
        local AUTOSTART_DIR="/home/ubuntu/.config/autostart"
        [ -e "${AUTOSTART_DIR}" ] || mkdir -p "${AUTOSTART_DIR}"
cat > "${AUTOSTART_DIR}/test.desktop" << EOF
[Desktop Entry]
Name=test
Comment=EDATEDtest
Exec=lxterminal --geometry=320x96 -e /home/ubuntu/.local/ed_test/ed_test_start.sh
Terminal=yes
MultipleArgs=false
Type=Application
Categories=Application;Development;
StartupNotify=true
EOF
    else
        cat /home/ubuntu/.bashrc | grep -q "/home/ubuntu/.local/ed_test/auto_test;"
        if [ $? -ne 0 ];then
            echo '' >> /home/ubuntu/.bashrc
            echo 'if [ -f "/home/ubuntu/.local/ed_test/auto_test" ];then /home/ubuntu/.local/ed_test/auto_test; fi' >> /home/ubuntu/.bashrc
        fi

    fi

}

function install_test(){
    local t_target=$1
    local t_json=$2
    local t_auto=$3
    if [ -z "${t_target}" ] || [ -z "${t_json}" ];then
        return 1
    fi
    
    local tmp_dir="${TMP_PATH}/test/"
    mkdir -p $tmp_dir
    mkdir -p "/home/ubuntu/.local/ed_test/"

    # wget "${BASE_URL}/test/ed-test.tar.gz" -O "${tmp_dir}ed-test.tar.gz"
    # tar -zxf "${tmp_dir}ed-test.tar.gz" -C /home/ubuntu/.local/ed_test/
    if [ "$t_auto" -eq "0" ];then
        local t_mode="-m"
        if [ "${TEST_MODE_NINE}" -ne "1" ];then
            t_mode="-b"
        fi

        if [ ${DESKTOP} -eq 0 ];then
            cat > /home/ubuntu/.local/ed_test/ed_test_start.sh << EOF
#!/bin/bash

function mnt_usb(){
    for i in {a..z};
    do
        ls /dev/sd\${i} > /dev/null 2>&1
        if [ \$? -eq 0 ];then
            ls /dev/sd\${i}1 > /dev/null 2>&1
            if [ \$? -eq 0 ];then
                ls /dev/sd\${i}2 > /dev/null 2>&1
                if [ \$? -ne 0 ];then
                    sudo mount /dev/sd\${i}1 /mnt
                    if [ -f "/mnt/eda/eda-test/ed_test" ];then
                        sudo chmod +x /mnt/eda/eda-test/ed_test
                        return 0
                    fi
                    sudo umount /mnt
                fi
            fi
        fi
    done
    return 1
}

function start(){
    sleep 4
    mnt_usb
    if [ \$? -eq 0 ];then
        lxterminal --geometry=240x60 -t "LXTerminal" -e "sleep 2 && sudo /mnt/eda/eda-test/ed_test -d ${t_target} ${t_mode} ${t_json} -c -n ${TEST_RETRY}"
        sudo umount /mnt
    else
        echo "Not found U-disk"
    fi
}

start
EOF
        else
            cat > /home/ubuntu/.local/ed_test/ed_test_start.sh << EOF
#!/bin/bash

function start(){
    sleep 2
    sudo /mnt/eda/eda-test/ed_test -d ${t_target} ${t_mode} ${t_json} -c -n ${TEST_RETRY}
}
start
EOF

            cat > /home/ubuntu/.local/ed_test/auto_test <<EOF
#!/bin/bash

function mnt_usb(){
    for i in {a..z};
    do
        ls /dev/sd\${i} > /dev/null 2>&1
        if [ \$? -eq 0 ];then
            ls /dev/sd\${i}1 > /dev/null 2>&1
            if [ \$? -eq 0 ];then
                ls /dev/sd\${i}2 > /dev/null 2>&1
                if [ \$? -ne 0 ];then
                    sudo mount /dev/sd\${i}1 /mnt
                    if [ -f "/mnt/eda/eda-test/ed_test" ];then
                        sudo chmod +x /mnt/eda/eda-test/ed_test
                        return 0
                    fi
                    sudo umount /mnt
                fi
            fi
        fi
    done
    return 1
}

function run(){
    sleep 4
    mnt_usb
    if [ \$? -eq 0 ];then
        rotate=""
        BOOT_DIR=\$(lsblk | grep " /boot" | awk '{print \$7}')
        cat \${BOOT_DIR}/config.txt | grep -q "^dtoverlay=vc4-kms-dsi-rzw-t101p136cq"
        if [ \$? -eq 0 ];then
            rotate="-r 3"
        fi
        fbterm -s 16 \${rotate} /home/ubuntu/.local/ed_test/ed_test_start.sh
        sudo umount /mnt
    else
        echo "Not found U-disk"
    fi
}

function start(){
    local result=\$(ps aux | grep ed_test_start.sh | grep -v grep | wc -l)
    if [ \$result -eq 0 ];then
        run
    fi
}

if [ -z "\${SSH_CONNECTION}" ];then
    start
fi
EOF
        
            chmod +x /home/ubuntu/.local/ed_test/auto_test
            sudo adduser ubuntu video
        fi
    fi
    chmod +x /home/ubuntu/.local/ed_test/ed_test_start.sh
    chown -R ubuntu:ubuntu /home/ubuntu/.local
    chown -R ubuntu:ubuntu /home/ubuntu/.config

    install_auto_test

    echo "${GLOBAL_IP}" > /home/ubuntu/.local/ed_test/server_ip
    
    sed -i "/^#FallbackNTP=/aFallbackNTP=${GLOBAL_IP} 0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org 3.debian.pool.ntp.org" /etc/systemd/timesyncd.conf
    systemctl restart systemd-timesyncd.service
}

function run_cmd(){
    local cmd=$1
    cmd=${cmd/\$\{BASE_URL\}/${BASE_URL}/}
    echo "run: ${cmd}"

    eval "$cmd"
}


if [ $# -gt 2 ];then
    case $3 in
        0)
            echo "Start install and auto test"
            ;;
        1)
            echo "Start install" 
            ;;
        2)
            echo "start test"
            ;;
        *)
            echo "Error arg"
            exit 2
            ;;
    esac
    if [ $# -gt 3 ];then
        TEST_RETRY=$4
    fi
else
    echo "$0 <IP> <board> <cmd> <retry>"
    exit 1
fi


[ ${BOARD} ] || usage

case $BOARD in
    hmi3010-101c | HMI3010-101C)
        install_debs_local ed-linux-image-base ed-base-bsp-v8 ed-hmi3010-101c-ubuntu-firmware
        install_hmi_debs
        T_TAGTE="30xx"
        T_JSON="delivery-hmi3010.json"
        ;;
    cm4sen | CM4SEN)
        install_debs_local ed-linux-image-base ed-base-bsp-v8 ed-cm4sen-rev1p0-bsp
        T_TAGTE="sen"
        T_JSON="delivery-cm4sen.json"
        config_uart
        ;;
    ipc2110 | IPC2110)
        install_debs_local ed-linux-image-base ed-base-bsp-v8 ed-ipc2110-firmware
        T_TAGTE="21xx"
        T_JSON="delivery-ipc.json"
        ;;
    ipc2630 | IPC2630)
        install_debs_local ed-linux-image-base ed-base-bsp-v8 ed-ipc2630-firmware
        T_TAGTE="26xx"
        T_JSON="delivery-ipc2630.json"
        ;;
    *)
        usage
        exit 1
        ;;
esac
install_test ${T_TAGTE} ${T_JSON} $3
t_pass
reboot
