#!/bin/sh

[ -r .conf ] || exit 125

UFRAW='eval ufraw-batch --interpolation=ahd --out-type=tiff${DEPTH} --overwrite --zip --wavelet-denoising-threshold=150'
DCRAW='eval dcraw -r 1.000000 0.500000 1.000000 0.500000 -H 0 -q 3 -n 150 $(test ${DEPTH} -ne 16 || printf -- -4) -T'
#DCRAW='eval dcraw -v -a -H 1 -q 3 -n 200 $(test ${DEPTH} -ne 16 || printf -- -4) -T'
NONA='nona -t 2 -o tmp-'
FULLA='fulla -t 2'
CCM='color_correct -E -c -p.03 -D64 -a-4096:4096+1024 -k24:40/32 -g28:36/32 -otmp.tiff'
ENBL='enblend -w -z -m 896 --fine-mask'
#CONV='convert -limit memory 512 -limit map 256'
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

N=0
for n in ${SRC}
do
    o=$(printf '%02d.tiff' ${N})
    N=$((${N}+1))
    [ -r ${o} ] && continue
    [ -r ${n}.RAW.bz2 ] && bzcat ${n}.RAW.bz2 >${n}.RAW
    [ -r ${n}.RAW.gz ] && zcat ${n}.RAW.gz >${n}.RAW
    [ -r ${n}.RAW ] || exit 126
    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 \
        -unsharp 0x0.50 \
        -depth ${DEPTH} \
        -compress zip ${o}
    rm -f ${n}.tiff
    if [ "${1}" = prep -a "${DEPTH}" = 8 ]
    then
        case $(((${N}-1)%3)) in
        0) m='50,50';;
        1) m='90,50';;
        2) m='150,50';;
        esac
        echo "${N}: ${m}"
        ${CONV} ${o} -modulate ${m} -gamma 2.2 -compress zip ${o}
    fi
done
[ "${1}" = prep ] && exit

f=$(awk '/^p /{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)

mkhdr () {
    for n in ${EXP}
    do
        eval "SFX=\${SFX${n}}"
        eval "IN=\${IN${n}}"
        ${ENBL} -f ${f} -o tmp${SFX}.tiff ${IN} \
        && rm ${IN} \
        && ${CONV} tmp${SFX}.tiff \
            +matte \
            -crop 5248x2304+248+842 +repage \
            -compress zip ${DST}${SFX}.tiff \
        && rm tmp${SFX}.tiff
    done
    pfsinhdrgen ${DST}.hdrgen \
    | pfshdrcalibrate -v -r linear -g 7.4 -b 16 \
    | ${KEEPHDR} \
    | octave -q ../../tools/pfsrgb.m \
       'Mr=max(max(R));
        mr=min(min(R));
        Mg=max(max(G));
        mg=min(min(G));
        Mb=max(max(B));
        mb=min(min(B));
        fprintf(stderr,"R=[%f:%f];G=[%f:%f];B=[%f:%f]\n",mr,Mr,mg,Mg,mb,Mb);
        R=R*0.470000;
        G=G*0.710000;
        B=B*1.000000;' \
    | pfstmo_reinhard02 -k 0.0225 -p 4 \
    | pfsgamma -m 1 -g 2.3 \
    | pfsoutimgmagick ${DST}.tiff \
    && for n in ${EXP}
       do
        eval "SFX=\${SFX${n}}"
        rm ${DST}${SFX}.tiff
       done
    test -r ${DST}.tiff
}

final () {
    SFX=${1}
    shift
    ${CONV} ${DST}.tiff \
        ${@} -modulate 100,105 -quality 90 ${DST}${SFX}.jpeg
    r=${?}
    return ${r}
}

${NONA} ${DST}.pto \
&& rm [0-9][0-9].tiff \
&& mkhdr \
&& ${CONV} ${DST}.tiff -resize x1536 -unsharp 0x0.75+0.6+0.04 -compress zip ${DST}.tiff \
&& final -big \
&& ${CONV} ${DST}.tiff -resize x768 -unsharp 0x0.75+0.6+0.04 -compress zip ${DST}.tiff \
&& final -middle \
&& ${CONV} ${DST}.tiff -resize x384 -unsharp 0x0.65+0.6+0.03 -compress zip ${DST}.tiff \
&& ${CONV} ${DST}.tiff -resize x256 -unsharp 0x0.65+0.6+0.03 -compress zip ${DST}.tiff \
&& final -small -gamma 1.10 \
&& rm ${DST}.tiff
exit
