#!/bin/bash
set -eux

OMERO_DIST=${OMERO_DIST:-/opt/omero/server/OMERO.server}
WORKDIR=$(mktemp -d)

function cleanup {
  rm -rf "$WORKDIR"
  echo "Deleted temp working directory $WORKDIR"
}

trap cleanup EXIT

# create fake images
touch "$WORKDIR/image1.fake"
{
    echo "pixelType=uint8"
    echo "sizeX=512"
    echo "sizeY=512"
    echo "sizeC=5"
    echo "sizeZ=3"
    echo "sizeT=7"
    echo "physicalSizeX=0.5µm"
    echo "physicalSizeY=0.5µm"
    echo "physicalSizeZ=1.5µm"
    echo "acquisitionDate=2020-04-01_20-04-01"
    echo "[series_0]"
    for i in {0..104}; do
        echo "DeltaT_$i=$((10 * $i))"
        echo "DeltaTUnit_$i=ms"
        echo "ExposureTime_$i=25"
        echo "ExposureTimeUnit_$i=ms"
        echo "PositionX_$i=0.1"
        echo "PositionY_$i=0.1"
        echo "PositionZ_$i=0.02"
        echo "PositionXUnit_$i=mm"
        echo "PositionYUnit_$i=mm"
        echo "PositionZUnit_$i=mm"
    done
} > "$WORKDIR/image1.fake.ini"

touch "$WORKDIR/image2.fake"
{
    echo "pixelType=uint8"
    echo "sizeX=512"
    echo "sizeY=512"
    echo "sizeC=5"
    echo "sizeZ=2"
    echo "sizeT=7"
} > "$WORKDIR/image2.fake.ini"

# create fake screens
touch "$WORKDIR/screen1.fake"
{
    echo "screens=1"
    echo "plates=1"
    echo "plateAcqs=2"
    echo "plateRows=3"
    echo "plateCols=3"
    echo "fields=2"
} > "$WORKDIR/screen1.fake.ini"

touch "$WORKDIR/screen2.fake"
{
    echo "screens=1"
    echo "plates=2"
    echo "plateAcqs=1"
    echo "plateRows=2"
    echo "plateCols=2"
    echo "fields=2"
} > "$WORKDIR/screen2.fake.ini"

export PATH=$PATH:${OMERO_DIST}/bin

omero login root@localhost -w omero

# add the root user to a second group
omero group add testGroup
omero group add testGroup1 --perms='rwr---'
omero group add testGroup2
omero group add testGroup3 --type=read-annotate
omero group adduser --name testGroup --user-name root
omero user add testUser firstname lastname testGroup -P password
omero user add testUser2 firstname2 lastname2 testGroup -P password2
omero user add testUser3 firstname3 lastname3 testGroup2 -P password3
omero user add testUser4 firstname4 lastname4 testGroup3 -P password4
omero group adduser --name testGroup1 testUser
omero group adduser --name testGroup3 testUser3
omero group adduser --name testGroup3 testUser4 --as-owner
omero quit

omero login testUser@localhost -w password -g testGroup

# create a simple project/dataset/image hierarchy
PROJECT1=$(omero obj new Project name=TestProject description=description)
PROJECT2=$(omero obj new Project name=TestProject2)

DATASET1=$(omero obj new Dataset name=TestDataset description=description)
DATASET2=$(omero obj new Dataset name=TestDatasetImport)
DATASET3=$(omero obj new Dataset name=TestDataset)
DATASET4=$(omero obj new Dataset name=TestDataset4)

omero obj new ProjectDatasetLink parent="$PROJECT1" child="$DATASET1"
omero obj new ProjectDatasetLink parent="$PROJECT1" child="$DATASET2"
omero obj new ProjectDatasetLink parent="$PROJECT2" child="$DATASET3"
omero obj new ProjectDatasetLink parent="$PROJECT1" child="$DATASET4"

IMAGE1=$(omero import --output=ids "$WORKDIR/image1.fake" -T "$DATASET1")
IMAGE2=$(omero import --output=ids "$WORKDIR/image1.fake" -T "$DATASET1")
IMAGE3=$(omero import --output=ids "$WORKDIR/image2.fake" -T "$DATASET1")
IMAGE4=$(omero import --output=ids "$WORKDIR/image1.fake" -T "$DATASET3")

omero obj new DatasetImageLink parent="$DATASET4" child="$IMAGE1"

# import screens
SCREEN1=$(omero obj new Screen name=TestScreen description=description)
SCREEN2=$(omero obj new Screen name=TestScreen2)
PLATE1=$(omero import "$WORKDIR/screen1.fake" -T "$SCREEN1")
omero import "$WORKDIR/screen2.fake" -T "$SCREEN2"

# add annotations
TAG1=$(omero obj new TagAnnotation textValue=tag1 description=description)
TAG2=$(omero obj new TagAnnotation textValue=tag2)
omero obj new TagAnnotation textValue=tag3
omero obj new ProjectAnnotationLink parent="$PROJECT2" child="$TAG1"
omero obj new DatasetAnnotationLink parent="$DATASET3" child="$TAG1"
omero obj new ImageAnnotationLink parent="$IMAGE1" child="$TAG1"
omero obj new ImageAnnotationLink parent="$IMAGE1" child="$TAG2"
omero obj new ImageAnnotationLink parent="$IMAGE2" child="$TAG1"
omero obj new ImageAnnotationLink parent="$IMAGE4" child="$TAG1"
omero obj new ScreenAnnotationLink parent="$SCREEN1" child="$TAG1"
omero obj new PlateAnnotationLink parent="$PLATE1" child="$TAG1"
omero obj new WellAnnotationLink parent="Well:1" child="$TAG1"

MAP1=$(omero obj new MapAnnotation)
omero obj map-set "$MAP1" mapValue testKey1 testValue1
omero obj map-set "$MAP1" mapValue testKey2 20
omero obj new ImageAnnotationLink parent="$IMAGE1" child="$MAP1"
omero obj new ImageAnnotationLink parent="$IMAGE3" child="$MAP1"

MAP2=$(omero obj new MapAnnotation)
omero obj map-set "$MAP2" mapValue testKey1 testValue2
omero obj map-set "$MAP2" mapValue testKey2 30
omero obj new ImageAnnotationLink parent="$IMAGE2" child="$MAP2"
