# app/api/v1/endpoints/device_tokens.py
from fastapi import APIRouter, Depends, HTTPException, status, Body
from sqlalchemy.orm import Session
from typing import List, Optional
from pydantic import BaseModel

from app.api import deps
from app.schemas.device_token import DeviceTokenCreate, DeviceTokenResponse
from app.services.device_token_service import DeviceTokenService
from app.models.device_token import DeviceToken
from app.core.time import now
import logging

logger = logging.getLogger('adimsayar')
router = APIRouter()

class RegisterDeviceTokenRequest(BaseModel):
    token: str
    device_type: str  # "ios", "android", "web"

class DeactivateDeviceTokenRequest(BaseModel):
    token: str

@router.post("/register", response_model=DeviceTokenResponse)
def register_device_token(
    req: RegisterDeviceTokenRequest,
    db: Session = Depends(deps.get_db),
    current_user = Depends(deps.get_current_user)
):
    """
    사용자 디바이스 토큰을 등록합니다. 
    이미 등록된 토큰이라면 활성 상태로 업데이트합니다.
    
    iOS, Android, Web, 그리고 Firebase FCM 토큰과 Expo 토큰 모두 지원합니다.
    """
    logger.info(f"디바이스 토큰 등록 요청: user_id={current_user.id}, device_type={req.device_type}")
    
    # Firebase FCM 토큰과 Expo 토큰 식별
    token_type = "expo" if req.token.startswith("ExponentPushToken[") else "firebase"
    logger.info(f"토큰 타입: {token_type}")
    
    # 이미 존재하는 토큰 확인
    existing_token = db.query(DeviceToken).filter(
        DeviceToken.device_token == req.token
    ).first()
    
    if existing_token:
        # 같은 사용자의 토큰이면 활성 상태로 업데이트
        if existing_token.user_id == current_user.id:
            existing_token.is_active = True
            existing_token.updated_at = now()
            db.commit()
            db.refresh(existing_token)
            logger.info(f"기존 토큰 활성화 완료: user_id={current_user.id}, token_type={token_type}")
            return DeviceTokenResponse.from_orm(existing_token)
        
        # 다른 사용자의 토큰이면 이전 사용자와 연결 해제 후 새 사용자에게 할당
        logger.warning(f"토큰 소유자 변경: 이전 user_id={existing_token.user_id}, 새 user_id={current_user.id}")
        existing_token.user_id = current_user.id
        existing_token.device_type = req.device_type
        existing_token.is_active = True
        existing_token.updated_at = now()
        db.commit()
        db.refresh(existing_token)
        return DeviceTokenResponse.from_orm(existing_token)
    
    # 새 토큰 등록
    device_token = DeviceToken(
        user_id=current_user.id,
        device_token=req.token,
        device_type=req.device_type,
        is_active=True
    )
    db.add(device_token)
    db.commit()
    db.refresh(device_token)
    logger.info(f"새 토큰 등록 완료: user_id={current_user.id}, token_type={token_type}, device_type={req.device_type}")
    
    return DeviceTokenResponse.from_orm(device_token)

@router.post("/deactivate", response_model=DeviceTokenResponse)
def deactivate_device_token(
    req: DeactivateDeviceTokenRequest,
    db: Session = Depends(deps.get_db),
    current_user = Depends(deps.get_current_user)
):
    """
    사용자 디바이스 토큰을 비활성화합니다.
    로그아웃 시 호출해야 합니다.
    """
    logger.info(f"디바이스 토큰 비활성화 요청: user_id={current_user.id}")
    
    device_token = db.query(DeviceToken).filter(
        DeviceToken.device_token == req.token,
        DeviceToken.user_id == current_user.id
    ).first()
    
    if not device_token:
        logger.warning(f"비활성화할 토큰을 찾을 수 없음: user_id={current_user.id}")
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail="Device token not found or already deactivated"
        )
    
    device_token.is_active = False
    device_token.updated_at = now()
    db.commit()
    db.refresh(device_token)
    logger.info(f"토큰 비활성화 완료: user_id={current_user.id}")
    
    return DeviceTokenResponse.from_orm(device_token)

@router.get("/", response_model=List[DeviceTokenResponse])
def get_user_device_tokens(
    db: Session = Depends(deps.get_db),
    current_user = Depends(deps.get_current_user)
):
    """
    사용자의 모든 디바이스 토큰을 조회합니다.
    """
    tokens = DeviceTokenService.get_user_device_tokens(db, current_user.id)
    return [DeviceTokenResponse.from_orm(token) for token in tokens]

@router.post("/register-firebase")
def register_firebase_token(
    token: str = Body(..., embed=True),
    device_type: str = Body(..., embed=True),
    db: Session = Depends(deps.get_db),
    current_user = Depends(deps.get_current_user)
):
    """
    Firebase FCM 토큰을 등록하기 위한 간단한 엔드포인트
    """
    logger.info(f"Firebase FCM 토큰 등록 요청: user_id={current_user.id}, device_type={device_type}")
    
    # 토큰이 Firebase FCM 토큰인지 확인
    if token.startswith("ExponentPushToken["):
        logger.warning(f"Firebase 등록에 Expo 토큰이 사용됨: user_id={current_user.id}")
        return {"message": "This endpoint is for Firebase FCM tokens only. Use /register for Expo tokens."}
    
    # Firebase 토큰 등록은 일반 등록과 동일한 로직 사용
    device_token = DeviceTokenService.add_device_token(
        db=db,
        user_id=current_user.id,
        token=token,
        device_type=device_type
    )
    
    return {
        "message": "Firebase token registered successfully",
        "token_id": device_token.id,
        "is_active": device_token.is_active
    } 