#!/bin/bash

function l3dComposer {
  php /usr/local/bin/.l3dComposer.php
}

function permissions {
  chmod -R g+w .
}

function readEnv {
  if [[ -f "${HOME}/.env" ]]; then
    # shellcheck disable=SC2046
    # shellcheck disable=SC2002
    export $(cat ${HOME}/.env | xargs) > /dev/null 2>&1
  fi
  if [[ -f ".env" ]]; then
    # shellcheck disable=SC2046
    # shellcheck disable=SC2002
    export $(cat .env | xargs) > /dev/null 2>&1
  fi
}

function truncateCurrentDirectory {
  readEnv
  rm .* > /dev/null 2>&1
}

function restoreEnvFile {
  if [[ "${COMPOSE_PROJECT_NAME}" == "." ]]; then
    return
  fi
  if [[ -n ${PHP_VERSION} ]]; then
    echo "PHP_VERSION=${PHP_VERSION}" >>.env
  fi
  if [[ -n ${COMPOSE_PROJECT_NAME} ]]; then
    echo "COMPOSE_PROJECT_NAME=${COMPOSE_PROJECT_NAME}" >>.env
  fi
  if [[ -n ${COMPOSER_DOWNGRADE} ]]; then
    echo "COMPOSER_DOWNGRADE=${COMPOSER_DOWNGRADE}" >>.env
  fi
  if [[ -f ".env" ]]; then
    # shellcheck disable=SC2046
    # shellcheck disable=SC2094
    # shellcheck disable=SC2002
    env -i $(cat .env | xargs) >.env
  fi
}

function create {
  if [[ -f ".init_site.json" ]]; then
    mv .init_site.json /tmp/init_site.json
  fi
  truncateCurrentDirectory
  if [[ -n ${REPOSITORY} ]]; then
    composer create-project "${PROJECT}" ./ --no-interaction --repository "${REPOSITORY}"
  else
    composer create-project "${PROJECT}" ./ --no-interaction
  fi
  l3dComposer
  permissions
  restoreEnvFile

  if [[ -f "docker-compose.yml" ]]; then
    # Start container
    a d4d up
    sleep 2
    drush --no-interaction si ${SITE_INSTALL_ARGS}

    # Init site config values
    if [[ -f "drush/Commands/dev_modules/dev_modules.info.yml" ]]; then
      if [[ -f "/tmp/init_site.json" ]]; then
        mv /tmp/init_site.json web/.init_site.json
        drush site:init .init_site.json
        rm web/.init_site.json
      fi
    fi

    # Dump database
    if [[ $L3D_DUMP_DB -eq 1 ]]; then
      git ignore "/*.sql"
      drush sql:dump --result-file ../db.sql
    fi

    drush -y cex
    # shellcheck disable=SC2035
    git add *
    git add .*
    git commit -am "After site install"

    # Push to remote git repository
    if [[ -n ${L3D_GIT_REMOTE} ]]; then
      git remote add origin "$L3D_GIT_REMOTE"
      git push -u origin main
    fi

    # Cleanup
    if [[ $L3D_CLEANUP -eq 1 ]]; then
      docker compose stop
      docker compose rm --force -v
    fi
  fi
  if [[ $L3D_EXIT -eq 1 ]]; then
    exit
  fi
}

function clone {
  truncateCurrentDirectory
  git clone "${REPOSITORY}" .
  l3dComposer
  composer create-project
  permissions
  restoreEnvFile
}

function initialSetup {
  echo "Lets start a new project here ..."
  echo ""
  echo "Options to start:"
  echo "    0   none: start with an empty container"
  echo "    1   LakeDrops Drupal 10 project template"
  echo "    2   LakeDrops Drupal 9 project template"
  echo "    3   LakeDrops Drupal 8 project template"
  echo "    4   drupal.org recommended project template (Drupal 10)"
  echo "    5   drupal.org recommended project template (Drupal 9)"
  echo "    6   Drupal's community project template (Drupal 8)"
  echo "    7   Custom project template"
  echo "    8   Existing git repository"
  echo ""
  echo ""

  while true; do
      # shellcheck disable=SC2162
      read -p "Choose an option: " OPTION
      case ${OPTION} in
          0 )
            restoreEnvFile
            l3dComposer
            break
            ;;

          1 )
            PROJECT="lakedrops/d10-project"
            SITE_INSTALL_ARGS="--existing-config"
            create
            break
            ;;

          2 )
            PROJECT="lakedrops/d9-project"
            SITE_INSTALL_ARGS="--existing-config"
            create
            break
            ;;

          3 )
            PROJECT="lakedrops/d8-project"
            SITE_INSTALL_ARGS="config_installer"
            create
            break
            ;;

          4 )
            PROJECT="drupal/recommended-project:^10"
            create
            break
            ;;

          5 )
            PROJECT="drupal/recommended-project:^9"
            create
            break
            ;;

          6 )
            PROJECT="drupal-composer/drupal-project:8.x-dev"
            create
            break
            ;;

          7 )
            # shellcheck disable=SC2162
            read -p "Custom project template: " PROJECT
            # shellcheck disable=SC2162
            read -p "Repository URL (optional): " REPOSITORY
            create
            break
            ;;

          8 )
            # shellcheck disable=SC2162
            read -p "Repository URL: " REPOSITORY
            if [[ -n "${REPOSITORY}" ]]; then
              clone
              break
            fi
            ;;

          * )
            echo "Please try again."
            ;;
      esac
  done
}

function setupAhoy {
  if [[ ! -f .ahoy.yml ]]; then
    echo "ahoyapi: v2" >.ahoy.yml
    echo "commands:" >>.ahoy.yml
  fi
  if [[ ! -L .ahoy.l3d ]]; then
    ln -s /etc/ahoy .ahoy.l3d
  fi
  if [[ -f .gitignore ]]; then
    EXISTING=$(cat .gitignore | grep "^/.ahoy.l3d$")
    if [[ -z ${EXISTING} ]]; then
      echo "/.ahoy.l3d" >>.gitignore
    fi
  fi
  EXISTING=$(cat .ahoy.yml | grep "^  changelog:")
  if [[ -z ${EXISTING} ]]; then
    echo "  changelog:" >>.ahoy.yml
    echo "    imports:" >>.ahoy.yml
    echo "      - ./.ahoy.l3d/changelog.yml" >>.ahoy.yml
    echo "    usage: Changelog tools." >>.ahoy.yml
  fi
}

if [[ -n ${PHP_VERSION} ]]; then
  echo "PHP_VERSION=${PHP_VERSION}" >>.env
fi
readEnv
# Validate PHP version
INSTALLED_PHP_VERSION=$(php -r "echo(substr(phpversion(),0,3));")
if [[ "$INSTALLED_PHP_VERSION" != "$PHP_VERSION" ]]; then
  echo -e "\\033[31m ===================================================== \\033[0m"
  echo -e "\\033[31m ERROR: PHP $INSTALLED_PHP_VERSION installed but $PHP_VERSION expected !!! \\033[0m"
  echo -e "\\033[31m ===================================================== \\033[0m"
  if [[ "${COMPOSE_PROJECT_NAME}" != "." ]]; then
    echo -e "\\033[31m Killed the outdated container, please start again !!! \\033[0m"
    echo -e "\\033[31m ===================================================== \\033[0m"
    docker rm -f ${COMPOSE_PROJECT_NAME}_l3d
  fi
fi
if [[ "$COMPOSER_DOWNGRADE" == "1" ]]; then
  composer self-update --1
fi
EXISTING=$(ls -1)
if [[ -z "$EXISTING" ]]; then
  if [[ -n ${PROJECT} ]]; then
    create
  elif [[ -n ${REPOSITORY} ]]; then
    clone
  else
    initialSetup
  fi
else
  l3dComposer
fi

if [[ -d /drupal/.idea ]]; then
  /usr/local/bin/.configIdea
fi
restoreEnvFile

if [[ "${COMPOSE_PROJECT_NAME}" != "." ]]; then
  # Setup Ahoy
  setupAhoy
  # Configure Git Hook
  if [[ -d .git ]]; then
    if [[ ! -d .git/hooks ]]; then
      mkdir -p .git/hooks
    fi
    if [[ ! -f .git/hooks/post-checkout ]]; then
      echo "#!/bin/sh" > .git/hooks/post-checkout
      chmod +x .git/hooks/post-checkout
    fi
    OLDCOMMAND='docker exec '${COMPOSE_PROJECT_NAME}'_l3d /usr/local/bin/update-env'
    NEWCOMMAND='RUNNING=$(docker container ls --all -q -f name='${COMPOSE_PROJECT_NAME}'_l3d);if [ "x$RUNNING" != "x" ];then docker exec '${COMPOSE_PROJECT_NAME}'_l3d /usr/local/bin/update-env;fi'
    OLD_HOOK_DEFINED=$(grep "$OLDCOMMAND" .git/hooks/post-checkout)
    NEW_HOOK_DEFINED=$(grep "$NEWCOMMAND" .git/hooks/post-checkout)
    if [[ "x$OLD_HOOK_DEFINED" = "x" ]]; then
      echo "$NEWCOMMAND" >> .git/hooks/post-checkout
    elif [[ "x$NEW_HOOK_DEFINED" = "x" ]]; then
      OLDCOMMAND="${OLDCOMMAND//\//\\/}"
      sed -i -e "/${OLDCOMMAND}/d" .git/hooks/post-checkout
      echo "$NEWCOMMAND" >> .git/hooks/post-checkout
    fi
  fi
fi
/usr/local/bin/update-env

if [[ -x "${L3DSHELL}" ]]; then
  ${L3DSHELL}
else
  /usr/bin/fish
fi