#!/bin/bash
# FastAPI 설치 스크립트
# Ubuntu 24.04 LTS - pista-ec2-fastapi

set -e

# Update system
apt update -y && apt upgrade -y

# Install Python and pip
apt install -y python3 python3-pip python3-venv

# Install common utilities
apt install -y net-tools curl unzip mysql-client

# Create project directory
mkdir -p ~/fastapi-rds/app
cd ~/fastapi-rds

# Create virtual environment
python3 -m venv venv
source venv/bin/activate

# Create requirements.txt
cat > requirements.txt << 'EOF'
fastapi==0.109.0
uvicorn[standard]==0.27.0
sqlalchemy==2.0.25
pymysql==1.1.0
python-dotenv==1.0.0
cryptography==42.0.0
EOF

# Install Python packages
pip install -r requirements.txt

# Create __init__.py
touch app/__init__.py

# Create database.py
cat > app/database.py << 'EOF'
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
import os
from dotenv import load_dotenv

load_dotenv()

DB_HOST = os.getenv("DB_HOST", "<YOUR_RDS_ENDPOINT>")
DB_PORT = os.getenv("DB_PORT", "3306")
DB_USER = os.getenv("DB_USER", "admin")
DB_PASSWORD = os.getenv("DB_PASSWORD", "<DB_PASSWORD>")
DB_NAME = os.getenv("DB_NAME", "fastapi_db")

SQLALCHEMY_DATABASE_URL = f"mysql+pymysql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}"

engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()
EOF

# Create models.py
cat > app/models.py << 'EOF'
from sqlalchemy import Column, Integer, String, DateTime
from sqlalchemy.sql import func
from .database import Base

class User(Base):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True, index=True)
    name = Column(String(100), nullable=False)
    email = Column(String(255), unique=True, index=True)
    created_at = Column(DateTime, server_default=func.now())
EOF

# Create schemas.py
cat > app/schemas.py << 'EOF'
from pydantic import BaseModel
from datetime import datetime
from typing import Optional

class UserBase(BaseModel):
    name: str
    email: str

class UserCreate(UserBase):
    pass

class User(UserBase):
    id: int
    created_at: Optional[datetime] = None

    class Config:
        from_attributes = True
EOF

# Create crud.py
cat > app/crud.py << 'EOF'
from sqlalchemy.orm import Session
from . import models, schemas

def get_users(db: Session, skip: int = 0, limit: int = 100):
    return db.query(models.User).offset(skip).limit(limit).all()

def get_user_by_email(db: Session, email: str):
    return db.query(models.User).filter(models.User.email == email).first()

def create_user(db: Session, user: schemas.UserCreate):
    db_user = models.User(name=user.name, email=user.email)
    db.add(db_user)
    db.commit()
    db.refresh(db_user)
    return db_user
EOF

# Create main.py
cat > app/main.py << 'EOF'
from fastapi import FastAPI, Depends, HTTPException
from sqlalchemy.orm import Session
from typing import List

from . import crud, models, schemas
from .database import engine, get_db

models.Base.metadata.create_all(bind=engine)

app = FastAPI(title="FastAPI + RDS MySQL")

@app.get("/")
def read_root():
    return {"message": "FastAPI with RDS MySQL"}

@app.get("/health")
def health_check():
    return {"status": "healthy"}

@app.get("/users/", response_model=List[schemas.User])
def read_users(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
    users = crud.get_users(db, skip=skip, limit=limit)
    return users

@app.post("/users/", response_model=schemas.User)
def create_user(user: schemas.UserCreate, db: Session = Depends(get_db)):
    db_user = crud.get_user_by_email(db, email=user.email)
    if db_user:
        raise HTTPException(status_code=400, detail="Email already registered")
    return crud.create_user(db=db, user=user)
EOF

# Create .env template
cat > .env.example << 'EOF'
DB_HOST=<YOUR_RDS_ENDPOINT>
DB_PORT=3306
DB_USER=admin
DB_PASSWORD=<DB_PASSWORD>
DB_NAME=fastapi_db
EOF

echo ""
echo "=========================================="
echo "FastAPI 설치 완료!"
echo "=========================================="
echo ""
echo "다음 단계:"
echo "1. .env 파일 생성: cp .env.example .env"
echo "2. .env 파일 편집: 실제 RDS 정보 입력"
echo "3. 서버 시작: source venv/bin/activate && uvicorn app.main:app --host 0.0.0.0 --port 8000"
echo ""
