#!/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 [[ -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
    if [[ -f "web/profiles/contrib/config_installer/config_installer.info.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 master
      fi

      # Cleanup
      if [[ $L3D_CLEANUP -eq 1 ]]; then
        docker-compose stop
        docker-compose rm --force -v
      fi
    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 9 project template"
  echo "    2   LakeDrops Drupal 8 project template"
  echo "    3   drupal.org recommended project template (Drupal 9)"
  echo "    4   Drupal's community project template (Drupal 8)"
  echo "    5   Custom project template"
  echo "    6   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/d9-project"
            SITE_INSTALL_ARGS="--existing-config"
            create
            break
            ;;

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

          3 )
            PROJECT="drupal/recommended-project"
            create
            break
            ;;

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

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

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

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

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"
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 [[ -x "${L3DSHELL}" ]]; then
  ${L3DSHELL}
else
  /usr/bin/fish
fi
