#!/bin/sh

[ -r .conf ] || exit 125

UFRAW='eval ufraw-batch --interpolation=ahd --out-type=tiff${DEPTH} --overwrite --zip --wavelet-denoising-threshold=150'
#DCRAW='dcraw -v -r 1.26744 1.00000 2.53014 1.00000 -H 0 -q 3 -n 300 -4 -T'
#DCRAW='dcraw -v -r 1.068441 1.000000 2.608365 1.000000 -H 0 -q 3 -n 300 -4 -T'
DCRAW='dcraw -v -r 1.128441 1.000000 2.588365 1.000000 -H 0 -q 3 -n 300 -4 -T'
#DCRAW='dcraw -v -w -H 0 -q 3 -n 300 -4 -T'
#NONA='nona -t 2 -o tmp-'
NONA='eval nona -v -t 2 -m TIFF_m -r ldr -p UINT${DEPTH} -z DEFLATE -o tmp-'
FULLA='fulla -v -t 2'
CCM='color_correct -E -c -p.03 -D64 -a-4096:4096+1024 -k24:40/32 -g28:36/32 -otmp.tiff'
ENBL='enblend -z -m 896 --fine-mask'
FGLB='fulla -t 2 -s -g 0.09:0.03:-0.9:1.75'
#CONV='convert -limit area 512 -limit map 2048 -limit memory 512'
CONV='convert'
#INPNT='greycstoration -alpha 0.9 -sigma 0.2 -p 5 -a 1 -dt 20 -iter 5 -bits 16 -m mask.png -inpaint'
#INPNT='greycstoration -alpha 0.9 -sigma 0.2 -iter 512 -bits 16 -inpaint'
INPNT='greycstoration -iter 1024 -bits 16 -inpaint'

LANG=C; export LANG

. .conf

[ -n "${DEPTH}" ] || DEPTH="${2}"
[ -n "${DEPTH}" ] || DEPTH=16

[ -z "${KEEPHDR}" ] || KEEPHDR="tee ${DST}.pfs"
[ -n "${KEEPHDR}" ] || KEEPHDR=cat

prep () {
    for e in ${EXP}
    do
        eval "SEQ=\${SEQ${e}}"
        eval "SRC=\${SRC${e}}"
        eval "SFX=\${SFX${e}}"
        N=0
        for n in ${SRC}
        do
            [ -z "${n}" -o "${n}" = SKEEP ] && continue
            o=$(printf '%02d%s' ${N} ${SFX})
            N=$((${N}+1))
            [ -r ${o}.tiff ] && continue
            [ -r ${n}.RAW.bz2 ] && bzcat ${n}.RAW.bz2 >${n}.RAW
            [ -r ${n}.RAW.gz ] && zcat ${n}.RAW.gz >${n}.RAW
            if [ -r ${n}.RAW ]
            then
                fl=$(dcraw -i -v ${n}.RAW|awk '/^Focal length: /{print $3}')
                #conf=${n}.ufraw
                #[ -z "${CONF}" ] || conf=${CONF}.ufraw
                #[ -r ${conf} ] || exit 125
                #${UFRAW} --conf=${conf} --output=${n}.tiff ${n}.RAW
                ${DCRAW} ${n}.RAW
                [ -r ${n}.RAW.bz2 -o -r ${n}.RAW.gz ] && rm -f ${n}.RAW
                tca="$( ( cd ../../tools/tca && echo "disp(tca('tca.db','fz50',${fl},1,0))"|octave -q|cat|head -1 ) )"
                #echo "Focal length: ${fl}; TCA correction: ${tca}"
                ${FULLA} ${tca} -o ${n}.tiff ${n}.tiff
                ${CONV} ${n}.tiff \
                    -depth 16 \
                    -orient undefined \
                    -unsharp 0x0.5 \
                    -compress zip ${o}.tiff
                rm -f ${n}.tiff
                if [ "${1}" = prep -a "${DEPTH}" = 8 ]
                then
                    case ${e} in
                    #0) m='20,50';;
                    #1) m='60,50';;
                    #2) m='100,50';;
                    #3) m='167,50';;
                    #4) m='500,50';;
                    *) m='100,100';;
                    esac
                    echo "${N}: ${m}"
                    ${CONV} ${o}.tiff \
                        -modulate ${m} -gamma 2.2 \
                        -depth 8 -compress zip ${o}.tiff
                fi
            elif [ -r ${n}.JPG ]
            then
                ${CONV} ${n}.JPG \
                    -depth ${DEPTH} \
                    -orient undefined \
                    -unsharp 0x0.3 \
                    -compress zip ${o}.tiff
                if [ "${1}" = prep -a "${DEPTH}" = 8 ]
                then
                    ${CONV} ${o}.tiff \
                        -gamma 1.4 \
                        -depth 8 -compress zip ${o}.tiff
                fi
            else
                exit 126
            fi
            [ -r mask-${o}.png -a \( "${1}" != prep -o "${DEPTH}" != 8 \) ] \
            && ${CONV} ${o}.tiff -matte \
                mask-${o}.png -compose multiply -composite \
                mask-${o}.png -channel A -fx 'v.r' \
                -compress zip ${o}.tiff
        done
    done
}

auto () {
    SIZE=2048
    for n in [0-9][0-9].tiff
    do
        mono ../../tools/autopano-sift-2.4/bin/generatekeys-sd.exe \
            ${n} ${n}.key.gz ${SIZE}
    done
    mono ../../tools/autopano-sift-2.4/bin/autopano.exe \
        --ransac on --maxmatches 200 \
        --refine --keep-unrefinable off \
        ${DST}-ap.pto \
        [0-9][0-9].tiff.key.gz \
        2>&1 \
        | grep -v '^peak-search at level '
    rm *.key.gz
    autooptimiser -a -l -s -v 52.6 -o ${DST}-ao.pto ${DST}-ap.pto
}

mkpano () {
    f=$(awk '/^p /{if(match($0,/w[0-9]+/)){w=substr($0,RSTART+1,RLENGTH-1);match($0,/h[0-9]+/);h=substr($0,RSTART+1,RLENGTH-1);print w"x"h}nextfile}' ${DST}.pto)
    [ -z "${f}" ] || f="-f ${f}"
    c=$(awk '/^p /{if(match($0,/S[0-9]+,[0-9]+,[0-9]+,[0-9]+/)){split(substr($0,RSTART+1,RLENGTH-1),a,/,/);print(a[2]-a[1])"x"(a[4]-a[3])"+"a[1]"+"a[3]}nextfile}' ${DST}.pto)
    [ -z "${c}" ] || c="-crop ${c} +repage"
    for e in ${EXP}
    do
        eval "SEQ=\${SEQ${e}}"
        NIN=''
        EIN=''
        for s in ${SEQ}
        do
            NIN="${NIN} -i ${s}"
            EIN=$(printf "${EIN} tmp-%04d.tif" ${s})
        done
        eval "SFX=\${SFX${e}}"
        ${NONA} ${NIN} ${DST}.pto \
        && ${ENBL} ${f} -o tmp${SFX}.tiff ${EIN} \
        && rm ${EIN} \
        && ${CONV} tmp${SFX}.tiff \
            +matte \
            ${c} \
            -unsharp 0x0.5 \
            -compress zip ${DST}${SFX}.tiff \
        && rm tmp${SFX}.tiff
    done

    [ "${1}" = pano -a "${DEPTH}" = 8 ] && return

    [ -n "${3}" ] \
    || for e in ${EXP}
       do
        eval "SFX=\${SFX${e}}"
        rm [0-9][0-9]${SFX}.tiff
       done
}

mkfinal () {
    SFX=${1}
    shift
    ${CONV} ${DST}.tiff \
        "${@}" -modulate 100,110 \
        -quality 90 ${DST}${SFX}.jpeg
    r=${?}
    rm -f ${DST}${SFX}.tiff
    return ${r}
}

mkfinal- () {
    SFX=${1}
    shift
    pfsinimgmagick --linear ${DST}.tiff \
    | pfsgamma -m 1.00 -g 1.00 \
    | pfstmo_reinhard02 -v -k 0.135 \
    | pfsgamma -m 0.65 -g 2.20 \
    | pfsoutimgmagick ${DST}${SFX}.tiff \
    && ${CONV} ${DST}${SFX}.tiff \
        -level 0%,93.75%,0.975 \
        "${@}" -modulate 100,110 \
        -quality 90 ${DST}${SFX}.jpeg
    r=${?}
    rm -f ${DST}${SFX}.tiff
    return ${r}
}

prep "${@}"
[ "${1}" = prep ] && exit
[ "${1}" = auto ] && { auto "${@}"; exit; }
mkpano "${@}"
[ "${1}" = pano ] && exit
${CONV} ${DST}.tiff -resize x1536 -unsharp 0x0.65+0.6+0.04 -compress zip ${DST}.tiff \
&& mkfinal -big \
&& ${CONV} ${DST}.tiff -resize x768 -unsharp 0x0.65+0.5+0.04 -compress zip ${DST}.tiff \
&& mkfinal -middle \
&& ${CONV} ${DST}.tiff -resize x384 -unsharp 0x0.55+0.4+0.03 -compress zip ${DST}.tiff \
&& ${CONV} ${DST}.tiff -resize x256 -unsharp 0x0.55+0.4+0.03 -compress zip ${DST}.tiff \
&& mkfinal -small -gamma 1.10 \
&& rm ${DST}.tiff
exit
