#!/bin/bash

# Скрипт для подготовки и развертывания приложения

# Цвета для вывода
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color

# Проверяем, установлен ли Azure CLI
if ! command -v az &> /dev/null; then
    echo -e "${RED}Azure CLI is not installed. Please install it before running the script.${NC}"
    echo "Instr: https://docs.microsoft.com/en-us/cli/azure/install-azure-cli"
    exit 1
fi

# Проверяем, авторизован ли пользователь в Azure
echo -e "${YELLOW}Checking authorization in Azure...${NC}"
az account show > /dev/null 2>&1
if [ $? -ne 0 ]; then
    echo -e "${YELLOW}Azure authorization required. Starting the sign-in process..${NC}"
    az login
    if [ $? -ne 0 ]; then
        echo -e "${RED}Azure Authorization Error. Exit.${NC}"
        exit 1
    fi
fi

# Загружаем переменные окружения
if [ -f .env ]; then
    echo -e "${GREEN}Loading environment variables from a file${NC}"
    export $(grep -v '^#' .env | xargs)
else
    echo -e "${RED}File .env not found. Please create one based on .env.example${NC}"
    exit 1
fi

# Проверяем наличие нужных переменных
if [[ -z "$AZURE_RESOURCE_GROUP" || -z "$AZURE_LOCATION" || -z "$AZURE_STORAGE_ACCOUNT" ]]; then
    echo -e "${RED}Not all required environment variables are defined in the .env file.${NC}"
    exit 1
fi

# Создаем группу ресурсов, если она не существует
echo -e "${YELLOW}Создание группы ресурсов ${AZURE_RESOURCE_GROUP}...${NC}"
az group create --name $AZURE_RESOURCE_GROUP --location $AZURE_LOCATION

# Создаем реестр контейнеров, если он не существует
echo -e "${YELLOW}Creating a container registry...${NC}"
az acr create --resource-group $AZURE_RESOURCE_GROUP --name $AZURE_CONTAINER_REGISTRY --sku Basic --admin-enabled true

# Получаем учетные данные реестра
echo -e "${YELLOW}Getting container registry credentials...${NC}"
REGISTRY_USERNAME=$(az acr credential show --name $AZURE_CONTAINER_REGISTRY --query "username" -o tsv)
REGISTRY_PASSWORD=$(az acr credential show --name $AZURE_CONTAINER_REGISTRY --query "passwords[0].value" -o tsv)
REGISTRY_URL=$(az acr show --name $AZURE_CONTAINER_REGISTRY --query "loginServer" -o tsv)

# Создаем учетную запись хранения, если она не существует
echo -e "${YELLOW}Creating storage account...${NC}"
az storage account create \
    --name $AZURE_STORAGE_ACCOUNT \
    --resource-group $AZURE_RESOURCE_GROUP \
    --location $AZURE_LOCATION \
    --sku Standard_LRS

# Получаем ключ учетной записи хранения
STORAGE_ACCOUNT_KEY=$(az storage account keys list --resource-group $AZURE_RESOURCE_GROUP --account-name $AZURE_STORAGE_ACCOUNT --query "[0].value" -o tsv)

# Создаем файловый ресурс для MongoDB
echo -e "${YELLOW}Creating a File Resource for MongoDB...${NC}"
az storage share create \
    --name mongodb-data \
    --account-name $AZURE_STORAGE_ACCOUNT \
    --account-key $STORAGE_ACCOUNT_KEY

# Создаем ключ хранилища для Azure Key Vault

echo -e "${YELLOW}Creating a Key Vault...${NC}"
az keyvault create \
    --name $AZURE_KEY_VAULT_NAME \
    --resource-group $AZURE_RESOURCE_GROUP \
    --location $AZURE_LOCATION

# Генерируем секретный ключ JWT

JWT_SECRET=$(openssl rand -hex 32)

# Добавляем секреты в Key Vault

echo -e "${YELLOW}Adding secrets to Key Vault...${NC}"
az keyvault secret set --vault-name $AZURE_KEY_VAULT_NAME --name "MONGODB-ROOT-USERNAME" --value $MONGODB_ROOT_USERNAME
az keyvault secret set --vault-name $AZURE_KEY_VAULT_NAME --name "MONGODB-ROOT-PASSWORD" --value $MONGODB_ROOT_PASSWORD
az keyvault secret set --vault-name $AZURE_KEY_VAULT_NAME --name "JWT-SECRET" --value $JWT_SECRET

# Создаем директорию и копируем туда файлы для сборки Docker-образа
echo -e "${YELLOW}Preparing files for building Docker image...${NC}"
mkdir -p build
cp -r src/* build/
cp Dockerfile build/
cp package.json build/

# Авторизуемся в реестре контейнеров
echo -e "${YELLOW}Авторизация в реестре контейнеров...${NC}"
az acr login --name $AZURE_CONTAINER_REGISTRY

# Сборка и публикация Docker-образа
echo -e "${YELLOW}Authorization in the container registry...${NC}"
cd build
docker build -t ${REGISTRY_URL}/brabus-app:latest .
docker push ${REGISTRY_URL}/brabus-app:latest
cd ..

# Создаем переменные для развертывания

export AZURE_CONTAINER_REGISTRY_URL=$REGISTRY_URL
export MONGODB_URI="mongodb://${MONGODB_ROOT_USERNAME}:${MONGODB_ROOT_PASSWORD}@mongodb:27017/brabus?authSource=admin"
export STORAGE_ACCOUNT_NAME=$AZURE_STORAGE_ACCOUNT
export STORAGE_ACCOUNT_KEY=$STORAGE_ACCOUNT_KEY

# Применяем шаблон развертывания

echo -e "${YELLOW}Applying deployment template...${NC}"
envsubst < azure_deployment.yml > azure_deployment_filled.yml
az container create --resource-group $AZURE_RESOURCE_GROUP --file azure_deployment_filled.yml

# Получаем публичный IP-адрес контейнера

CONTAINER_IP=$(az container show --resource-group $AZURE_RESOURCE_GROUP --name brabus-container-group --query "ipAddress.ip" -o tsv)



echo -e "${GREEN}Deployment completed SUCCERFULLY!!!!${NC}"
echo -e "${GREEN}The application is available AT: http://${CONTAINER_IP}:3000${NC}"
echo -e "${YELLOW}Note: To configure HTTPS, you must configure a domain name and SSL certificate${NC}"

