run:
	uv run python -m src.main

run-api:
	uv run uvicorn src.app:app --host 0.0.0.0 --port 8095

format:
	uv run ruff format .

# バックグラウンドで起動
up:
	docker compose -f up -d --build

# -----------------------------------------------------------------------------
# Deploy
# -----------------------------------------------------------------------------
deploy:
	make deploy-api
	make deploy-lambda

# -----------------------------------------------------------------------------
# App Runner デプロイ
# -----------------------------------------------------------------------------
ECR_REGISTRY := 903877990773.dkr.ecr.ap-northeast-1.amazonaws.com
ECR_REPOSITORY := historical-accuracy-stg
IMAGE_URI := $(ECR_REGISTRY)/$(ECR_REPOSITORY)
IMAGE_TAG ?= latest
AWS_REGION ?= ap-northeast-1

# ECR リポジトリを新規作成（初回のみ。既に存在する場合はエラーになるが無視してよい）
ecr-create:
	aws ecr create-repository --repository-name $(ECR_REPOSITORY) --region $(AWS_REGION)
	@echo "ECR リポジトリ作成済み: $(ECR_REGISTRY)/$(ECR_REPOSITORY)"

# ECR にログイン（push の前に実行される）
ecr-login:
	aws ecr get-login-password --region $(AWS_REGION) | docker login --username AWS --password-stdin $(ECR_REGISTRY)

# Docker イメージをビルド
docker-build:
	docker build -t $(IMAGE_URI):$(IMAGE_TAG) .

# 上記イメージを ECR に push（ecr-login → docker-build → push。初回は先に make ecr-create）
ecr-push: ecr-login docker-build
	docker push $(IMAGE_URI):$(IMAGE_TAG)
	@echo "Pushed $(IMAGE_URI):$(IMAGE_TAG)"

# make deploy-api          → ECR push（IMAGE_TAG=latest）のあと start-deployment のみ
# make deploy-api SKIP_ECR=1 → push はスキップし、現在ソースに設定されたイメージで start-deployment
# 別タグを指したい場合は事前に update-service で ImageIdentifier を変更すること
# 環境変数（src/lib/aws_config.py 用）。非同期ジョブ利用時は JOB_LAMBDA_FUNCTION_NAME / JOB_RESULT_BUCKET を指定すること
APP_RUNNER_SERVICE_ARN ?= arn:aws:apprunner:ap-northeast-1:903877990773:service/historical-accuracy-stg/f2a822c74c3e490c9bd1fd07f937e22b
JOB_LAMBDA_FUNCTION_NAME ?= historical-accuracy-worker
JOB_RESULT_BUCKET ?= historical-accuracy-results

deploy-api:
	@test -n "$(APP_RUNNER_SERVICE_ARN)" || (echo "APP_RUNNER_SERVICE_ARN を指定してください"; exit 1)
	@if [ -z "$(SKIP_ECR)" ]; then $(MAKE) ecr-push; fi
	@echo "App Runner デプロイ開始: $(IMAGE_URI):$(IMAGE_TAG)"
	aws apprunner start-deployment --service-arn "$(APP_RUNNER_SERVICE_ARN)" --region $(AWS_REGION)
	@echo "状態確認: aws apprunner describe-service --service-arn $(APP_RUNNER_SERVICE_ARN)"

# -----------------------------------------------------------------------------
# Lambda ワーカー デプロイ（コンテナイメージ・非同期ジョブ用）
# -----------------------------------------------------------------------------
# make lambda-deploy → イメージをビルドして ECR に push。関数が無ければ作成、あれば更新
# 初回: make lambda-ecr-create。作成時は LAMBDA_EXECUTION_ROLE_ARN を指定すること
# 環境変数: JOB_RESULT_BUCKET を指定すると Lambda に渡る（API が Lambda を直接 Invoke するためキューは不要）
LAMBDA_FUNCTION_NAME ?= historical-accuracy-worker
LAMBDA_ECR_REPOSITORY ?= historical-accuracy-worker
LAMBDA_IMAGE_URI := $(ECR_REGISTRY)/$(LAMBDA_ECR_REPOSITORY):$(IMAGE_TAG)
LAMBDA_EXECUTION_ROLE_ARN ?= arn:aws:iam::903877990773:role/lambda-worker-role
LAMBDA_TIMEOUT ?= 900
LAMBDA_MEMORY_SIZE ?= 4096

# LocalStack 用 Lambda zip を生成（dist/lambda.zip）。docker compose 前に make lambda-zip を実行すると Lambda が使える
lambda-zip:
	@mkdir -p dist/lambda-package
	uv export --no-dev -o dist/lambda-package/requirements.txt
	uv pip install -r dist/lambda-package/requirements.txt -t dist/lambda-package
	cp -r src dist/lambda-package/
	cd dist/lambda-package && zip -r ../lambda.zip . && cd ../..
	@echo "dist/lambda.zip を生成しました"

# Lambda 用 ECR リポジトリを新規作成（初回のみ）
lambda-ecr-create:
	aws ecr create-repository --repository-name $(LAMBDA_ECR_REPOSITORY) --region $(AWS_REGION)
	@echo "ECR リポジトリ作成済み: $(ECR_REGISTRY)/$(LAMBDA_ECR_REPOSITORY)"

# Lambda 用コンテナイメージをビルド（単一プラットフォーム・attestation なしで Lambda 互換に）
lambda-docker-build:
	DOCKER_BUILDKIT=1 docker build --platform linux/amd64 --provenance=false --sbom=false -f Dockerfile.lambda -t $(LAMBDA_IMAGE_URI) .

# Lambda 用イメージを ECR に push
lambda-ecr-push: ecr-login lambda-docker-build
	docker push $(LAMBDA_IMAGE_URI)
	@echo "Pushed $(LAMBDA_IMAGE_URI)"

# 関数が無ければ作成、あればイメージ＋環境変数を更新
deploy-lambda: lambda-ecr-push
	@test -n "$(LAMBDA_FUNCTION_NAME)" || (echo "LAMBDA_FUNCTION_NAME を指定してください"; exit 1)
	@if aws lambda get-function --function-name "$(LAMBDA_FUNCTION_NAME)" --region $(AWS_REGION) >/dev/null 2>&1; then \
		echo "Lambda 関数が存在するため、イメージと環境変数を更新します..."; \
		aws lambda update-function-code \
			--function-name "$(LAMBDA_FUNCTION_NAME)" \
			--image-uri "$(LAMBDA_IMAGE_URI)" \
			--region $(AWS_REGION); \
		echo "イメージ反映を待機中..."; \
		aws lambda wait function-updated --function-name "$(LAMBDA_FUNCTION_NAME)" --region $(AWS_REGION); \
		aws lambda update-function-configuration \
			--function-name "$(LAMBDA_FUNCTION_NAME)" \
			--environment "Variables={JOB_RESULT_BUCKET=$(JOB_RESULT_BUCKET)}" \
			--region $(AWS_REGION); \
	else \
		echo "Lambda 関数が存在しないため、新規作成します..."; \
		test -n "$(LAMBDA_EXECUTION_ROLE_ARN)" || (echo "新規作成時は LAMBDA_EXECUTION_ROLE_ARN を指定してください"; exit 1); \
		aws lambda create-function \
			--function-name "$(LAMBDA_FUNCTION_NAME)" \
			--package-type Image \
			--code ImageUri="$(LAMBDA_IMAGE_URI)" \
			--role "$(LAMBDA_EXECUTION_ROLE_ARN)" \
			--timeout $(LAMBDA_TIMEOUT) \
			--memory-size $(LAMBDA_MEMORY_SIZE) \
			--environment "Variables={JOB_RESULT_BUCKET=$(JOB_RESULT_BUCKET)}" \
			--region $(AWS_REGION); \
	fi
	@echo "Lambda 完了: $(LAMBDA_FUNCTION_NAME)"