#!/bin/sh  
# \
exec oagtclsh "$0" "$@"

set auto_path [linsert $auto_path 0  /usr/local/oag/apps/lib/$env(HOST_ARCH)]
set auto_path [linsert $auto_path 0 /usr/local/oag/lib_patch/$env(HOST_ARCH)]
package require os

APSStandardSetup

proc Convert {args} {
    set xlsinput ""
    set sddsoutput ""
    set columnNameList ""
    set columnTypeList ""
    set columnUnitsList ""
    set skiplines 0
    set verbose 0
    APSStrictParseArguments {xlsinput sddsoutput columnNameList columnTypeList columnUnitsList skiplines verbose}

    set csvoutputRoot [APSTmpDir]/[APSTmpString]
    set csvoutputTemplate ${csvoutputRoot}-%n-%s.csv

    if {$skiplines} {
        set options "-skiplines=$skiplines "
    } else {
        set options ""
    }
    foreach name $columnNameList type $columnTypeList units $columnUnitsList {
        append options "-columnData=name=${name},type=$type,units=$units "
    }
    if {![file exists $xlsinput]} {
        puts stderr "Error: $xlsinput does not exist"
        exit 1
    }
    if {[file exists $sddsoutput]} {
        file delete -force $sddsoutput
    }
    if $verbose {
        puts stderr "catch {exec ssconvert --export-type=Gnumeric_stf:stf_csv --export-file-per-sheet $xlsinput $csvoutputTemplate}"
    }
    if {[catch {exec ssconvert --export-type=Gnumeric_stf:stf_csv --export-file-per-sheet \
        $xlsinput $csvoutputTemplate} results]} {
        if $verbose {
            puts stderr "$results"
        }
    }
    if $verbose {
        puts stderr "csv files: [lsort [glob -nocomplain $csvoutputRoot-*.csv]]"
    }
    foreach csvoutput [lsort [glob -nocomplain $csvoutputRoot-*.csv]] {
        regexp ($csvoutputRoot)-(\[0-9\]*)-(.*).csv $csvoutput matched dummy index sheetName
        if $verbose {
            puts stderr "$csvoutput: matched=$matched index=$index sheetName=$sheetName"
        }
        # Make a copy in case $csvoutput has spaces
        file copy -force $csvoutput $csvoutputRoot.csv
        set sddspage $csvoutputRoot-$index.sdds
        set fileIndex($index) $sddspage
        if {[catch {eval exec csv2sdds $csvoutputRoot.csv $sddspage -asciiOutput $options} results]} {
            puts stderr "Error: $results"
        }
        exec sddsprocess $sddspage -nowarning "-print=parameter,SheetName,$sheetName"
        file delete ${sddspage}~
    }
    set sddspageList [list ]
    foreach index [lsort [array names fileIndex]] {
        lappend sddspageList $fileIndex($index)
    }
    eval exec sddscombine $sddspageList -pipe=out \
        | sddsconvert -pipe=in -delete=parameter,Filename,NumberCombined $sddsoutput 
    file delete -force $csvoutput $sddspageList
}

set input ""
set output ""
set columnNameList ""
set columnTypeList ""
set columnUnitsList ""
set skiplines 0
set verbose 0
set args $argv
if {[APSStrictParseArguments {input output noParam columnNameList columnTypeList columnUnitsList skiplines verbose}]} {
    puts stderr "usage: xls2sdds -input <filename> -output <filename>"
    puts stderr "                -columnNameList <name1,name2,name3,...>"
    puts stderr "                -columnTypeList <string,long,float,...>"
    puts stderr "                \[-columnUnitsList <units1,units2,...>]"
    puts stderr "                -skiplines <nrows> -verbose {0|1}"
    exit 1
}
if {([llength $input] == 0) || ([llength $output] == 0) || ([llength $columnNameList] == 0) || ([llength $columnTypeList] == 0)} {
    puts stderr "usage: xls2sdds -input <filename> -output <filename>"
    puts stderr "                -columnNameList <name1,name2,name3,...>"
    puts stderr "                -columnTypeList <string,long,float,...>"
    puts stderr "                \[-columnUnitsList <units1,units2,...>]"
    puts stderr "                -skiplines <nrows> -verbose {0|1}"
    exit 1
}
set columnNameList [split $columnNameList ,]
set columnTypeList [split $columnTypeList ,]
if ![string length $columnUnitsList] {
    set columnUnitsList [APSReplicateItem -number [llength $columnNameList]]
} else {
    set columnUnitsList [split $columnUnitsList ,]
}
if {[llength $columnNameList] != [llength $columnTypeList]} {
    puts stderr "Error: -columnNameList and -columnTypeList are different lengths"
    exit 1
}
if {[llength $columnNameList] != [llength $columnUnitsList]} {
    puts stderr "Error: -columnNameList and -columnUnitsList are different lengths"
    exit 1
}

Convert -xlsinput $input -sddsoutput $output -columnNameList $columnNameList -columnTypeList $columnTypeList \
    -skiplines $skiplines -verbose $verbose -columnUnitsList $columnUnitsList

