#!/bin/bash

#
# include files
#
source bash_ui
source bash_f_dlg
source bash_sg_dlg
source bash_pr_dlg

#
# global data
#
typeset device_info
typeset device_data
typeset sel_driver
typeset error_log

###################################################
#
# configure dialog
#
###################################################

typeset -a driver_list_array
typeset driver_list_sel_index=0
typeset driver_list_top_index=0
typeset driver_list_height=8


load_drv_config_help() {
    load_ui_res << EOF
~
~    &([Help])
~    +-----------------------------------------+
~    |     Key        |      Function          |
~    |----------------|------------------------|
~    |    Up arrow    |   Scroll up            |
~    |    Down arrow  |   Scroll down          |
~    |    Page up     |   Scroll page up       |
~    |    Page down   |   Scroll page down     |
~    |    Home        |   Scroll to first      |
~    |    End         |   Scroll to end        |
~    |    x           |   Cancel               |
~    |    O           |   Confirm              |
~    +-----------------------------------------+
~       Press 'x' to return
EOF
}


load_drv_config_ui() {
        load_ui_res << EOF
(fff-fff/fff)=<?range,13?>
~
~    &([Burn VCD] --> Select driver)
~    +-----------------------------------------+
~    |                                         |
~    | DRIVER: <?driver,-#?>################## |
~    |                                         |
~    |-----------------------------------------|
~    | <?list[0],-#?>######################### |
~    | <?list[1],-#?>######################### |
~    | <?list[2],-#?>######################### |
~    | <?list[3],-#?>######################### |
~    | <?list[4],-#?>######################### |
~    | <?list[5],-#?>######################### |
~    | <?list[6],-#?>######################### |
~    | <?list[7],-#?>######################### |
~    |--------------(fff-fff/fff)--------------|
~    |                                         |
~    |   [O -- OK]           [X -- Cancel]     |
~    |                                         |
~    +-----------------------------------------+
~    
~      Press &(?) for help
EOF
}

drv_config_get_data() {
    local name=$1
    local -i index=$2
    _DATA_="???"
    case $name in
        list)
            get_list_data "driver_list" $index
            ;;
        range)
            get_list_range "driver_list" 13
            ;;
        driver)
            _DATA_="${driver_list_array[$driver_list_sel_index]}"
            ;;
    esac
}

run_drv_config_ui() {
    driver_list_sel_index=0
    local -i i=0
    while [ $i -lt ${#driver_list_array[*]} ]; do
        if [ "$sel_driver" == "${driver_list_array[$i]}" ]; then
            driver_list_sel_index=$i
        fi
        let i++
    done
    load_drv_config_ui
    _FOCUS_="driver_list"
    local close="false"
    while [ "$close" != "true" ]; do
        update_ui "drv_config_get_data"
        read_key
        case "$_KEY_" in
            up|down|pgup|pgdown|home|end)
                scroll_list "driver_list" $_KEY_
                ;;
            X|x)
                close="true"
                ;;
            O|o)
                sel_driver="${driver_list_array[$driver_list_sel_index]}"
                close="true"
                ;;
            '?')
                load_drv_config_help
                update_ui
                while [ "$_KEY_" != "x" ]; do read_key; done
                load_drv_config_ui
                ;;
        esac
    done
}


###################################################
#
# Main dialog
#
###################################################

load_burn_vcd_dialog_ui() {
        load_ui_res << EOF
[A=[&(A)
[R=[&(R)
[U=[&(U)
[D=[&(D)
[[]C -- Config[]]=<?config,-13?>
[[]K -- Action[]]=[<?key,1?> -- <?action,-7?>
[X=[&(X)
(fff-fff/fff)=<?range,13?>
~
~    <?title,-#?>############################
~    +-----------------------------------------+
~    |                                         |
~    | DEVICE: <?device,-#?>################## |
~    |                                         |
~    |-----------------------------------------|
~    | <?list[0],-#?>######### |               |
~    | <?list[1],-#?>######### | [A -- Add]    |
~    | <?list[2],-#?>######### | [R -- Remove] |
~    | <?list[3],-#?>######### | [U -- Up]     |
~    | <?list[4],-#?>######### | [D -- Down]   |
~    | <?list[5],-#?>######### | [K -- Action] |
~    | <?list[6],-#?>######### | [C -- Config] |
~    | <?list[7],-#?>######### | [X -- Exit]   |
~    | <?list[8],-#?>######### |               |
~    |-----(fff-fff/fff)-----------------------|
~    |                                         |
~    | Total size: <?size,-#?>####             |
~    |                                         |
~    +-----------------------------------------+
~    
~      Press &(?) for help
EOF
}

burn_vcd_dialog_get_data() {
    case $1 in
        device)
            _DATA_="${device_info#*:}"
            ;;
        config)
            if [ ${#driver_list_array[*]} -gt 0 ]; then
                _DATA_="[C -- Config]"
            else
                _DATA_=""
            fi
            ;;
    esac
}

burn_vcd_dialog_action() {
    case $_KEY_ in
        C|c)
            if [ ${#driver_list_array[*]} -gt 0 ]; then
                run_drv_config_ui
                load_burn_vcd_dialog_ui
                _FOCUS_="src_list"
            fi
            ;;
    esac
}

#
# $1 -- config file name
# $2 -- entry
#
#  entry=value
#
read_confg() {
    cat $1 | sed -n -e "/$2=/p" | sed -e "s/$2=\(.*\)/\1/"
}

###################################################
#
# util functions
#
###################################################

check_device() {
    device_info=`cdrdao scanbus 2>&1 | tee | sed -n -e "/[0-9],[0-9],[0-9]:/p" | sed -n -e "1p"`
    device_data=${device_info%%:*}
    if ! [ -z "$(cdrdao disk-info --device $device_data  2>&1 | tee | sed -n -e '/No driver found.*available drivers/p')" ]; then
        driver_list_array=($(cdrdao disk-info --device $device_data 2>&1 | sed -e '/[ ]/d' -e '/^$/d'))
    fi
}

typeset -a mpg_file_list

make_mpg_file_list() {
    local -i i=0
    while [ $i -lt ${#src_list_array[*]} ]; do
        mpg_file_list[$i]="${src_dir_array[$i]}/${src_list_array[$i]}"
        let i++
    done
}

burn_vcd() {
    local ret_code=0
    if ! [ -d "vcd_image" ]; then
        mkdir vcd_image
    fi
    cd vcd_image
    rm -rf *
    show_status "Making VCD image ..." "Please wait ..."
    make_mpg_file_list
    error_log=$(vcdimager "${mpg_file_list[@]}" 2>&1 | tee | sed -n -e '/ERROR:/p')
    if [ -z "$error_log" ]; then
        show_status "Bruning the disk ..." "Please wait ..."
        if [ ${#driver_list_array[*]} -gt 0 ]; then
            error_log=$(cdrdao write --device $device_data --driver $sel_driver videocd.cue  2>&1 | tee | sed -n -e '/ERROR:/p')
        else
            error_log=$(cdrdao write --device $device_data videocd.cue  2>&1 | tee | sed -n -e '/ERROR:/p')
        fi
    fi
    cd -
}

load_settings() {
    if [ -f .mkvcd.cfg ]; then
        sel_driver="$(read_confg .mkvcd.cfg driver)"
        recent_dir="$(read_confg .mkvcd.cfg recent_dir)"
    else
        sel_driver="generic-mmc"
        recent_dir=`pwd`
    fi
}

save_settings() {
    echo "driver=$sel_driver" > .mkvcd.cfg
    echo "recent_dir=$recent_dir" >> .mkvcd.cfg
}

##################################################
#
#  The main procedure
#
##################################################
root_path=${0%[/]*}
export PATH=$PATH:/bin:$root_path
if [ -d /cygdrive/d/Private/Video ]; then
    root_path=/cygdrive/d/Private/Video
fi
cd "$root_path"
load_settings
tty_init
src_gather_dlg_get_data_ex="burn_vcd_dialog_get_data"
src_gather_dlg_load_ui_ex="load_burn_vcd_dialog_ui"
src_gather_dlg_action_ex="burn_vcd_dialog_action"
src_list_height=9
load_process_dlg_ui
show_status "Detect CD RW device ..." "Please wait ..."
check_device
if [ "$device_info" == "" ]; then
    echo "No CD-RW device detected."
    echo -n "press any key ..."
    read_key
    exit 1
fi
run_src_gather_dialog "[Burn VCD]" "Burn" "Burn the VCD" '*.[Mm][Pp][Gg]' '*.mpg'
if [[ "$_KEY_" == [Bb] ]]; then
    load_process_dlg_ui
    burn_vcd
    if [ -z "$error_log" ]; then
        show_status "Bruning the VCD ... OK!" "Press any key to exit"
    else
        show_status "Bruning the VCD ... FAIL!" "Please see the error log"
        echo 
        echo "================== error log ========================="
        echo "$error_log"
        echo
        echo -n "Press any key to exit ..."
    fi
    read_key
fi
tty_restore
cd "$root_path"
save_settings
exit 0

