# ------------------------------------------------------------------------------
# Пути
# ------------------------------------------------------------------------------
API_DIR := api
FRONTEND_DIR := frontend

# Секунды ожидания для `docker compose up --wait` (healthcheck Postgres + API).
WAIT_TIMEOUT ?= 300
DOCKER_UP := docker compose up -d --wait --wait-timeout $(WAIT_TIMEOUT)

# После `make prepare` / `make dev`: вызвать `rails db:seed` в backend (0 — не вызывать).
SEED_ON_PREPARE ?= 1

# ------------------------------------------------------------------------------
# Локальная разработка: Postgres + Rails на хосте (без Docker)
# ------------------------------------------------------------------------------
LOCAL_PG_HOST ?= localhost
LOCAL_PG_PORT ?= 5432
LOCAL_PG_USER ?= postgres
LOCAL_PG_PASSWORD ?= postgres
LOCAL_PG_DB ?= app_development

LOCAL_PG_ENV := PGPASSWORD=$(LOCAL_PG_PASSWORD) PGHOST=$(LOCAL_PG_HOST) PGPORT=$(LOCAL_PG_PORT) PGUSER=$(LOCAL_PG_USER)
LOCAL_RAILS_ENV := DATABASE_HOSTNAME=$(LOCAL_PG_HOST) DATABASE_PORT=$(LOCAL_PG_PORT) DATABASE_USERNAME=$(LOCAL_PG_USER) DATABASE_PASSWORD=$(LOCAL_PG_PASSWORD)

# Команда для local-rails: make local-rails RAILS_CMD="db:migrate"
RAILS_CMD ?= console

.DEFAULT_GOAL := help

.PHONY: help prepare setup dev \
	restart build start stop logs bash \
	rails bundle yarn npm \
	up \
	db db-console db-migrate db-rollback db-reset db-seed db-prepare \
	db-create db-drop db-docker-recreate \
	db-create-user db-grant-user \
	local-bundle local-rails local-console local-server \
	local-db-create local-db-drop local-db-migrate local-db-rollback \
	local-db-reset local-db-seed local-db-prepare local-db-console

help:
	@echo "Быстрый старт (Docker: БД + API + фронтенд)"
	@echo "  make prepare    # сборка, up, затем db:seed (если SEED_ON_PREPARE=1; то же: make setup)"
	@echo "  make dev        # prepare, затем логи всех сервисов (Ctrl+C — только выход из просмотра логов)"
	@echo "  make up         # поднять стек (ждёт готовности Postgres и API)"
	@echo "  make stop       # docker compose down"
	@echo ""
	@echo "Прочие команды Docker"
	@echo "  make restart|build|logs"
	@echo "  make bash              # оболочка в контейнере backend"
	@echo "  make rails CMD=...     # например: make rails CMD=db:migrate"
	@echo "  make bundle CMD=...    # bundle в контейнере backend"
	@echo "  make yarn CMD=...      # yarn в контейнере frontend"
	@echo "  make db-console        # psql в контейнере БД (синоним: make db)"
	@echo "  make db-migrate|db-rollback|db-reset|db-seed|db-prepare"
	@echo "  make db-create|db-drop # rails db:create / db:drop в backend"
	@echo "  make db-docker-recreate # пустая БД в контейнере Postgres (dropdb + createdb)"
	@echo ""
	@echo "Локально на хосте (Postgres + Rails без Docker)"
	@echo "  make local-bundle && make local-db-prepare && make local-server"
	@echo "  Параметры БД: переменные LOCAL_PG_* в начале этого Makefile"

# ------------------------------------------------------------------------------
# Docker Compose — подготовка и жизненный цикл
# ------------------------------------------------------------------------------
prepare setup:
	docker compose build
	$(DOCKER_UP)
ifneq ($(SEED_ON_PREPARE),0)
	docker compose exec -T backend ./bin/rails db:seed
endif
	@echo ""
	@echo "Готово:"
	@echo "  API        http://localhost:3000"
	@echo "  Фронтенд   http://localhost:5173"
	@echo "  Postgres   localhost:5432, БД app_development, пользователь postgres"

dev: prepare
	docker compose logs -f

restart:
	docker compose down
	docker compose up -d --build --wait --wait-timeout $(WAIT_TIMEOUT)

build:
	docker compose build

start up:
	$(DOCKER_UP)

stop:
	docker compose down

logs:
	docker compose logs -f

bash:
	docker compose exec backend bash

rails:
	docker compose exec backend ./bin/rails $(CMD)

bundle:
	docker compose exec backend bundle $(CMD)

yarn:
	docker compose exec frontend yarn $(CMD)

npm:
	docker compose exec frontend npm $(CMD)

db-console db:
	docker compose exec database psql -U postgres -d app_development

db-migrate:
	docker compose exec backend ./bin/rails db:migrate

db-rollback:
	docker compose exec backend ./bin/rails db:rollback

db-reset:
	docker compose exec backend ./bin/rails db:reset

db-seed:
	docker compose exec -T backend ./bin/rails db:seed

db-prepare:
	docker compose exec backend ./bin/rails db:prepare

db-create:
	docker compose exec backend ./bin/rails db:create

db-drop:
	docker compose exec backend ./bin/rails db:drop

db-docker-recreate:
	docker compose exec database dropdb --if-exists -U postgres app_development
	docker compose exec database createdb -U postgres app_development

db-create-user:
	docker compose exec database psql -U postgres -c "CREATE USER app_development WITH PASSWORD 'app_development';"

db-grant-user:
	docker compose exec database psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE app_development TO app_development;"

# ------------------------------------------------------------------------------
# Локально: Bundler + Rails + psql к Postgres на хосте
# ------------------------------------------------------------------------------
local-bundle:
	cd $(API_DIR) && bundle install

local-rails:
	cd $(API_DIR) && $(LOCAL_RAILS_ENV) bin/rails $(RAILS_CMD)

local-console:
	$(MAKE) local-rails RAILS_CMD=console

local-server:
	cd $(API_DIR) && $(LOCAL_RAILS_ENV) bin/rails server -b 0.0.0.0 -p 3000

local-db-create:
	cd $(API_DIR) && $(LOCAL_RAILS_ENV) bin/rails db:create

local-db-drop:
	cd $(API_DIR) && $(LOCAL_RAILS_ENV) bin/rails db:drop

local-db-migrate:
	cd $(API_DIR) && $(LOCAL_RAILS_ENV) bin/rails db:migrate

local-db-rollback:
	cd $(API_DIR) && $(LOCAL_RAILS_ENV) bin/rails db:rollback

local-db-reset:
	cd $(API_DIR) && $(LOCAL_RAILS_ENV) bin/rails db:reset

local-db-seed:
	cd $(API_DIR) && $(LOCAL_RAILS_ENV) bin/rails db:seed

local-db-prepare:
	cd $(API_DIR) && $(LOCAL_RAILS_ENV) bin/rails db:prepare

local-db-console:
	$(LOCAL_PG_ENV) psql -d $(LOCAL_PG_DB)
