#!/usr/bin/env bash
set -euo pipefail

WORKDIR="/BLUES/eric/ONT/MAPQ_bam"
PUBLIC="/BLUES/eric/Public_html"
JSON="$PUBLIC/ONT_MAPQ_tracks.json"

cd "$WORKDIR"

declare -A inputs=(
  [ONT_Naive]="ONT_Naive.MAPQ10.primary.5mC_CpG_combined.bed.gz"
  [ONT_Primed]="ONT_Primed.MAPQ10.primary.5mC_CpG_combined.bed.gz"
  [ONT_TSC]="ONT_TSC.MAPQ10.primary.5mC_CpG_combined.bed.gz"
)

echo "Step 1: rebuild methylC.gz and .tbi in $WORKDIR"

for sample in ONT_Naive ONT_Primed ONT_TSC
do
  in="${inputs[$sample]}"
  out="${sample}.MAPQ10.primary.noY.onC.methylC"

  echo "Rebuilding $sample"
  echo "  input:  $in"
  echo "  output: ${out}.gz"

  if [[ ! -s "$in" ]]; then
    echo "ERROR: missing input $in" >&2
    exit 1
  fi

  rm -f "${out}" "${out}.gz" "${out}.gz.tbi" "${out}.tmp" "${out}.tmp.gz"

  zcat "$in" \
    | awk 'BEGIN{OFS="\t"}
        /^track/ || /^browser/ || /^#/ {next}
        NF>=11 &&
        $1 ~ /^chr([0-9]+|X|M|Y)$/ &&
        $1 != "chrY" &&
        $2 ~ /^[0-9]+$/ &&
        $3 ~ /^[0-9]+$/ &&
        $3>$2 {
          meth = $11 / 100.0
          cov = int($10)
          print $1,$2,$3,"CG",meth,"+",cov
        }' \
    | sort -k1,1 -k2,2n \
    > "${out}.tmp"

  bgzip -f "${out}.tmp"
  mv "${out}.tmp.gz" "${out}.gz"

  tabix -f -p bed "${out}.gz"

  chmod 644 "${out}.gz" "${out}.gz.tbi"

  echo "  testing tabix query:"
  if ! tabix "${out}.gz" chr1:10000-20000 > "${out}.tabix_test.tmp"; then
    echo "ERROR: tabix query failed for ${out}.gz" >&2
    exit 1
  fi
  head -3 "${out}.tabix_test.tmp"
  rm -f "${out}.tabix_test.tmp"

  echo "  chrom order:"
  tabix -l "${out}.gz" | head -10
done

echo
echo "Step 2: remove old public ONT MAPQ methylC files"

rm -f "$PUBLIC"/ONT_Naive.MAPQ10.primary.onC.methylC.gz*
rm -f "$PUBLIC"/ONT_Primed.MAPQ10.primary.onC.methylC.gz*
rm -f "$PUBLIC"/ONT_TSC.MAPQ10.primary.onC.methylC.gz*

rm -f "$PUBLIC"/ONT_Naive.MAPQ10.primary.noY.onC.methylC.gz*
rm -f "$PUBLIC"/ONT_Primed.MAPQ10.primary.noY.onC.methylC.gz*
rm -f "$PUBLIC"/ONT_TSC.MAPQ10.primary.noY.onC.methylC.gz*

echo
echo "Step 3: copy repaired files to Public_html"

cp "$WORKDIR"/ONT_Naive.MAPQ10.primary.noY.onC.methylC.gz* "$PUBLIC"/
cp "$WORKDIR"/ONT_Primed.MAPQ10.primary.noY.onC.methylC.gz* "$PUBLIC"/
cp "$WORKDIR"/ONT_TSC.MAPQ10.primary.noY.onC.methylC.gz* "$PUBLIC"/

chmod 644 "$PUBLIC"/ONT_*MAPQ10.primary.noY.onC.methylC.gz*

echo
echo "Step 4: write fixed JSON: $JSON"

cat > "$JSON" <<'JSONEOF'
[
  {
    "type": "methylC",
    "name": "Naive W3MECP2 (Q10 noY)",
    "url": "https://regmedsrv1.wustl.edu/Public_SPACE/eric/Public_html/ONT_Naive.MAPQ10.primary.noY.onC.methylC.gz",
    "indexUrl": "https://regmedsrv1.wustl.edu/Public_SPACE/eric/Public_html/ONT_Naive.MAPQ10.primary.noY.onC.methylC.gz.tbi",
    "options": {
      "isCombineStrands": true,
      "colorsForContext": {
        "CG": { "color": "#006400", "background": "#d9d9d9" }
      }
    },
    "metadata": { "dataType": "methylC", "cellType": "Naive", "cellLine": "W3MECP2", "platform": "ONT", "filter": "MAPQ10 primary noY" }
  },
  {
    "type": "methylC",
    "name": "Prime W3MECP2 (Q10 noY)",
    "url": "https://regmedsrv1.wustl.edu/Public_SPACE/eric/Public_html/ONT_Primed.MAPQ10.primary.noY.onC.methylC.gz",
    "indexUrl": "https://regmedsrv1.wustl.edu/Public_SPACE/eric/Public_html/ONT_Primed.MAPQ10.primary.noY.onC.methylC.gz.tbi",
    "options": {
      "isCombineStrands": true,
      "colorsForContext": {
        "CG": { "color": "#006400", "background": "#d9d9d9" }
      }
    },
    "metadata": { "dataType": "methylC", "cellType": "Prime", "cellLine": "W3MECP2", "platform": "ONT", "filter": "MAPQ10 primary noY" }
  },
  {
    "type": "methylC",
    "name": "TSC W3MECP2 (Q10 noY)",
    "url": "https://regmedsrv1.wustl.edu/Public_SPACE/eric/Public_html/ONT_TSC.MAPQ10.primary.noY.onC.methylC.gz",
    "indexUrl": "https://regmedsrv1.wustl.edu/Public_SPACE/eric/Public_html/ONT_TSC.MAPQ10.primary.noY.onC.methylC.gz.tbi",
    "options": {
      "isCombineStrands": true,
      "colorsForContext": {
        "CG": { "color": "#006400", "background": "#d9d9d9" }
      }
    },
    "metadata": { "dataType": "methylC", "cellType": "TSC", "cellLine": "W3MECP2", "platform": "ONT", "filter": "MAPQ10 primary noY" }
  }
]
JSONEOF

chmod 644 "$JSON"

echo
echo "Step 5: test public files locally with tabix"

cd "$PUBLIC"

for f in ONT_Naive.MAPQ10.primary.noY.onC.methylC.gz \
         ONT_Primed.MAPQ10.primary.noY.onC.methylC.gz \
         ONT_TSC.MAPQ10.primary.noY.onC.methylC.gz
do
  echo "===== $f ====="
  tabix "$f" chr1:10000-20000 | head -3
done

echo
echo "Step 6: test URLs"

for f in ONT_Naive.MAPQ10.primary.noY.onC.methylC.gz \
         ONT_Naive.MAPQ10.primary.noY.onC.methylC.gz.tbi \
         ONT_Primed.MAPQ10.primary.noY.onC.methylC.gz \
         ONT_Primed.MAPQ10.primary.noY.onC.methylC.gz.tbi \
         ONT_TSC.MAPQ10.primary.noY.onC.methylC.gz \
         ONT_TSC.MAPQ10.primary.noY.onC.methylC.gz.tbi \
         ONT_MAPQ_tracks.json
do
  echo "===== $f ====="
  curl -I --http1.1 "https://regmedsrv1.wustl.edu/Public_SPACE/eric/Public_html/$f" | head -5
done

echo
echo "Done."
echo "JSON URL:"
echo "https://regmedsrv1.wustl.edu/Public_SPACE/eric/Public_html/ONT_MAPQ_tracks.json"
