#!/bin/bash

# iOS 앱 빌드 스크립트 (디버그 및 릴리즈 버전)
# 사용법: ./build-ios.sh

# 색상 정의
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color

# 프로젝트 디렉토리로 이동
cd "$(dirname "$0")"

# 설정 파일 확인 및 로드
CONFIG_FILE="$HOME/.zellyy_ios_build.conf"
if [ -f "$CONFIG_FILE" ]; then
    source "$CONFIG_FILE"
fi

# 캐시 삭제 함수
clean_cache() {
  echo -e "${YELLOW}캐시 삭제 중...${NC}"
  
  echo -e "${YELLOW}1. Xcode 파생 데이터 삭제중...${NC}"
  rm -rf ~/Library/Developer/Xcode/DerivedData/App-*
  
  echo -e "${YELLOW}2. Pod 캐시 삭제중...${NC}"
  rm -rf ios/App/Pods
  rm -rf ios/App/Podfile.lock
  
  echo -e "${YELLOW}3. iOS 빌드 디렉토리 삭제중...${NC}"
  rm -rf ios/App/build
  mkdir -p ios/App/build
  xattr -w com.apple.xcode.CreatedByBuildSystem true ios/App/build
  
  echo -e "${YELLOW}4. Node 모듈 캐시 삭제중...${NC}"
  rm -rf node_modules/.cache
  
  echo -e "${YELLOW}5. Capacitor 빌드 캐시 삭제중...${NC}"
  rm -rf ios/App/App/public
  
  echo -e "${GREEN}캐시 삭제 완료!${NC}"
}

# 신뢰 인증서 안내 함수
show_certificate_trust_guide() {
  echo -e "\n${YELLOW}=== 앱 실행 시 인증서 신뢰 문제가 발생하는 경우 ====${NC}"
  echo -e "${YELLOW}실제 기기에서 앱을 실행하려면 개발자 인증서를 신뢰해야 합니다.${NC}"
  echo -e "${YELLOW}다음 단계를 따라 인증서를 신뢰하세요:${NC}"
  echo -e "1. iOS 기기에서 '설정' 앱을 엽니다."
  echo -e "2. '일반' > 'VPN 및 기기 관리'로 이동합니다."
  echo -e "3. 개발자 앱 인증서(사용자 이름 포함)를 선택합니다."
  echo -e "4. '신뢰'를 탭하여 인증서를 신뢰합니다."
  echo -e "${YELLOW}인증서 신뢰 후 다시 앱을 실행해보세요.${NC}"
  echo -e "${YELLOW}=============================================${NC}\n"
}

# 메인 메뉴 표시
show_main_menu() {
  echo -e "\n${YELLOW}Zellyy Finance iOS 앱 빌드 스크립트${NC}"
  echo -e "${YELLOW}=============================${NC}"
  echo -e "작업을 선택하세요:"
  echo -e "1) 앱 빌드"
  echo -e "2) 캐시 삭제"
  echo -e "3) 종료"
  echo -n "선택 (1-3) [${LAST_MAIN_CHOICE:-1}]: "
  read -r MAIN_CHOICE
  MAIN_CHOICE=${MAIN_CHOICE:-${LAST_MAIN_CHOICE:-1}}
  echo "LAST_MAIN_CHOICE=$MAIN_CHOICE" > "$CONFIG_FILE"
  
  case $MAIN_CHOICE in
    1)
      # 앱 빌드 선택 시 자동으로 캐시 삭제 수행
      echo -e "${YELLOW}빌드 전 자동 캐시 삭제 중...${NC}"
      clean_cache
      start_build_process
      ;;
    2)
      clean_cache
      echo -e "\n${YELLOW}메인 메뉴로 돌아갑니다...${NC}"
      show_main_menu
      ;;
    3)
      echo -e "${YELLOW}스크립트를 종료합니다.${NC}"
      exit 0
      ;;
    *)
      echo -e "${RED}잘못된 선택입니다. 종료합니다.${NC}"
      exit 1
      ;;
  esac
}

# 빌드 프로세스 시작
start_build_process() {
  # 버전 관리 스크립트 실행
  echo -e "${YELLOW}버전 정보 관리 시작...${NC}"
  source ./ios-version-manager.sh
  if [ $? -ne 0 ]; then
      echo -e "${RED}버전 정보 관리 중 오류가 발생했습니다.${NC}"
      exit 1
  fi
  echo -e "${GREEN}버전 정보 관리 완료!${NC}"

  # 빌드 타입 선택 메뉴
  echo -e "\n${YELLOW}빌드 타입을 선택하세요:${NC}"
  echo -e "1) 디버그 빌드 (개발 및 테스트용)"
  echo -e "2) 릴리즈 빌드 (App Store 배포용)"
  echo -e "3) 취소"
  echo -n "선택 (1-3) [${LAST_BUILD_TYPE:-1}]: "
  read -r CHOICE
  CHOICE=${CHOICE:-${LAST_BUILD_TYPE:-1}}

  case $CHOICE in
    1)
      BUILD_TYPE="debug"
      CONFIGURATION="Debug"
      echo "LAST_BUILD_TYPE=1" >> "$CONFIG_FILE"
      ;;
    2)
      BUILD_TYPE="release"
      CONFIGURATION="Release"
      echo "LAST_BUILD_TYPE=2" >> "$CONFIG_FILE"
      ;;
    3)
      echo -e "${YELLOW}빌드를 취소합니다.${NC}"
      exit 0
      ;;
    *)
      echo -e "${RED}잘못된 선택입니다. 빌드를 취소합니다.${NC}"
      exit 1
      ;;
  esac

  # 개발자 등록 여부 확인
  echo -e "${YELLOW}Apple 개발자 계정에 등록되어 있습니까? (y/n) [${LAST_DEV_REGISTERED:-n}]:${NC}"
  read -r DEV_REGISTERED
  DEV_REGISTERED=${DEV_REGISTERED:-${LAST_DEV_REGISTERED:-n}}
  echo "LAST_DEV_REGISTERED=$DEV_REGISTERED" >> "$CONFIG_FILE"

  # 개발자 등록이 된 경우에만 계정 정보 입력
  if [[ "$DEV_REGISTERED" == "y" || "$DEV_REGISTERED" == "Y" ]]; then
      echo -e "${YELLOW}Apple 개발자 계정 이메일을 입력하세요 [${LAST_APPLE_ID:-}]:${NC}"
      read -r APPLE_ID
      APPLE_ID=${APPLE_ID:-${LAST_APPLE_ID:-}}
      echo "LAST_APPLE_ID=$APPLE_ID" >> "$CONFIG_FILE"
      
      echo -e "${YELLOW}Apple 개발자 팀 ID를 입력하세요 [${LAST_TEAM_ID:-}]:${NC}"
      read -r TEAM_ID
      TEAM_ID=${TEAM_ID:-${LAST_TEAM_ID:-}}
      echo "LAST_TEAM_ID=$TEAM_ID" >> "$CONFIG_FILE"
      
      CREATE_IPA="y"
  else
      echo -e "${YELLOW}개발자 등록 없이 진행합니다. IPA 파일 생성 기능은 제한됩니다.${NC}"
      APPLE_ID=""
      TEAM_ID=""
      CREATE_IPA="n"
  fi

  # 빌드 시작
  echo -e "\n${YELLOW}iOS $CONFIGURATION 빌드를 시작합니다...${NC}"

  # 웹 앱 빌드
  echo -e "${YELLOW}웹 앱 빌드 중...${NC}"
  npm run build

  if [ $? -ne 0 ]; then
      echo -e "${RED}웹 앱 빌드 중 오류가 발생했습니다.${NC}"
      exit 1
  fi

  # Capacitor 동기화
  echo -e "${YELLOW}Capacitor 동기화 중...${NC}"
  npx cap sync ios

  if [ $? -ne 0 ]; then
      echo -e "${RED}Capacitor 동기화 중 오류가 발생했습니다.${NC}"
      exit 1
  fi

  # iOS 앱 빌드
  echo -e "${YELLOW}iOS 네이티브 앱 빌드 중...${NC}"
  cd ios/App
  pod install

  if [ $? -ne 0 ]; then
      echo -e "${RED}CocoaPods 설치 중 오류가 발생했습니다.${NC}"
      exit 1
  fi

  # 빌드 타입에 따른 처리
  if [ "$BUILD_TYPE" = "debug" ]; then
    # 디버그 빌드
    echo -e "${YELLOW}디버그 빌드 시작...${NC}"
    
    # 기본적인 빌드 (IPA 없이)
    xcodebuild -workspace App.xcworkspace -scheme App -configuration Debug -derivedDataPath build
    
    if [ $? -ne 0 ]; then
      echo -e "${RED}디버그 빌드 실패. 오류를 확인하세요.${NC}"
      exit 1
    fi
    
    echo -e "${GREEN}디버그 빌드 성공!${NC}"
    echo -e "빌드 경로: $(pwd)/build/Build/Products/Debug-iphoneos"
    
    # 개발자 등록이 된 경우에만 IPA 생성 옵션 제공
    if [[ "$DEV_REGISTERED" == "y" || "$DEV_REGISTERED" == "Y" ]]; then
      # IPA 파일 생성 여부 확인
      echo -e "${YELLOW}디버그용 IPA 파일을 생성하시겠습니까? (y/n) [${LAST_DEBUG_IPA_CHOICE:-n}]:${NC}"
      read -r CREATE_DEBUG_IPA
      CREATE_DEBUG_IPA=${CREATE_DEBUG_IPA:-${LAST_DEBUG_IPA_CHOICE:-n}}
      echo "LAST_DEBUG_IPA_CHOICE=$CREATE_DEBUG_IPA" >> "$CONFIG_FILE"
      
      if [[ "$CREATE_DEBUG_IPA" == "y" || "$CREATE_DEBUG_IPA" == "Y" ]]; then
        echo -e "${YELLOW}디버그용 IPA 파일 생성 중...${NC}"
        
        # exportOptions.plist 파일 생성
        cat > exportOptionsDebug.plist << EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>method</key>
    <string>development</string>
    <key>teamID</key>
    <string>${TEAM_ID}</string>
    <key>compileBitcode</key>
    <false/>
</dict>
</plist>
EOF
        
        # 아카이브 생성
        xcodebuild -workspace App.xcworkspace -scheme App -configuration Debug clean archive -archivePath "build/App-Debug.xcarchive" -allowProvisioningUpdates
        
        if [ $? -ne 0 ]; then
          echo -e "${RED}아카이브 생성 실패. 오류를 확인하세요.${NC}"
          rm exportOptionsDebug.plist
          exit 1
        fi
        
        # IPA 파일 생성
        xcodebuild -exportArchive -archivePath "build/App-Debug.xcarchive" -exportOptionsPlist exportOptionsDebug.plist -exportPath "build/export-debug" -allowProvisioningUpdates
        
        if [ $? -ne 0 ]; then
          echo -e "${RED}IPA 파일 생성 실패. 오류를 확인하세요.${NC}"
          rm exportOptionsDebug.plist
          exit 1
        fi
        
        rm exportOptionsDebug.plist
        
        DEBUG_IPA_PATH="build/export-debug/App.ipa"
        DEBUG_DEST_PATH="$HOME/Dev/zellyy-finance-ios-debug.ipa"
        
        if [ -f "$DEBUG_IPA_PATH" ]; then
          echo -e "${GREEN}디버그용 IPA 파일 생성 성공!${NC}"
          echo -e "IPA 파일 위치: $(pwd)/$DEBUG_IPA_PATH"
          
          # 홈 디렉토리로 IPA 복사
          cp "$DEBUG_IPA_PATH" "$DEBUG_DEST_PATH"
          echo -e "${GREEN}IPA를 홈 디렉토리에 복사했습니다: $DEBUG_DEST_PATH${NC}"
          
          echo -e "${YELLOW}다음 방법으로 다른 기기에 설치할 수 있습니다:${NC}"
          echo "1. Apple Configurator 2 앱 사용"
          echo "2. 기기 등록 및 프로비저닝 프로파일이 있는 경우 iTunes로 설치"
          echo "3. TestFlight를 통한 배포 (App Store Connect에 업로드 필요)"
        else
          echo -e "${RED}IPA 파일 생성 실패. 오류를 확인하세요.${NC}"
        fi
      fi
    else
      echo -e "${YELLOW}개발자 등록이 필요하여 IPA 파일 생성 단계를 건너뜁니다.${NC}"
      echo -e "${YELLOW}시뮬레이터에서 앱을 테스트하거나 Apple 개발자 계정을 등록하세요.${NC}"
    fi
    
  elif [ "$BUILD_TYPE" = "release" ]; then
    # 릴리즈 빌드
    echo -e "${YELLOW}릴리즈 빌드 시작...${NC}"
    
    # 기본 Xcode 빌드
    xcodebuild -workspace App.xcworkspace -scheme App -configuration Release -derivedDataPath build
    
    if [ $? -ne 0 ]; then
      echo -e "${RED}릴리즈 빌드 실패. 오류를 확인하세요.${NC}"
      exit 1
    fi
    
    echo -e "${GREEN}릴리즈 빌드 성공!${NC}"
    echo -e "빌드 경로: $(pwd)/build/Build/Products/Release-iphoneos"
    
    # 개발자 등록이 된 경우에만 아카이브 생성 옵션 제공
    if [[ "$DEV_REGISTERED" == "y" || "$DEV_REGISTERED" == "Y" ]]; then
      # App Store 배포용 아카이브 생성 여부 확인
      echo -e "${YELLOW}App Store 배포용 아카이브를 생성하시겠습니까? (y/n) [${LAST_RELEASE_ARCHIVE_CHOICE:-n}]:${NC}"
      read -r CREATE_RELEASE_ARCHIVE
      CREATE_RELEASE_ARCHIVE=${CREATE_RELEASE_ARCHIVE:-${LAST_RELEASE_ARCHIVE_CHOICE:-n}}
      echo "LAST_RELEASE_ARCHIVE_CHOICE=$CREATE_RELEASE_ARCHIVE" >> "$CONFIG_FILE"
      
      if [[ "$CREATE_RELEASE_ARCHIVE" == "y" || "$CREATE_RELEASE_ARCHIVE" == "Y" ]]; then
        echo -e "${YELLOW}App Store 배포용 아카이브 생성 중...${NC}"
        
        # 아카이브 생성
        xcodebuild -workspace App.xcworkspace -scheme App -configuration Release clean archive -archivePath "build/App.xcarchive" -allowProvisioningUpdates
        
        if [ $? -ne 0 ]; then
          echo -e "${RED}아카이브 생성 실패. 오류를 확인하세요.${NC}"
          exit 1
        fi
        
        echo -e "${GREEN}아카이브 생성 성공!${NC}"
        echo -e "아카이브 위치: $(pwd)/build/App.xcarchive"
        
        # exportOptions.plist 파일 생성
        cat > exportOptions.plist << EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>method</key>
    <string>app-store</string>
    <key>teamID</key>
    <string>${TEAM_ID}</string>
    <key>uploadBitcode</key>
    <false/>
    <key>uploadSymbols</key>
    <true/>
    <key>provisioningProfiles</key>
    <dict>
        <key>com.lovable.zellyfinance</key>
        <string>Zellyy Finance App Store</string>
    </dict>
</dict>
</plist>
EOF
        
        # IPA 파일 생성
        echo -e "${YELLOW}IPA 파일 생성 중...${NC}"
        xcodebuild -exportArchive -archivePath "build/App.xcarchive" -exportOptionsPlist exportOptions.plist -exportPath "build/export" -allowProvisioningUpdates
        
        if [ $? -ne 0 ]; then
          echo -e "${RED}IPA 파일 생성 실패. 오류를 확인하세요.${NC}"
          rm exportOptions.plist
          exit 1
        fi
        
        rm exportOptions.plist
        
        IPA_PATH="build/export/App.ipa"
        DEST_PATH="$HOME/Dev/zellyy-finance-ios.ipa"
        
        if [ -f "$IPA_PATH" ]; then
          echo -e "${GREEN}IPA 파일 생성 성공!${NC}"
          echo -e "IPA 파일 위치: $(pwd)/$IPA_PATH"
          
          # 홈 디렉토리로 IPA 복사
          cp "$IPA_PATH" "$DEST_PATH"
          echo -e "${GREEN}IPA를 홈 디렉토리에 복사했습니다: $DEST_PATH${NC}"
          
          echo -e "${YELLOW}다음 단계:${NC}"
          echo "1. App Store Connect에 로그인: https://appstoreconnect.apple.com"
          echo "2. 앱 > 젤리의 적자탈출 > iOS 앱 > 빌드 섹션으로 이동"
          echo "3. Transporter 앱을 사용하여 IPA 파일 업로드: $DEST_PATH"
          echo "4. 검토 과정이 완료될 때까지 기다리기 (보통 몇 시간에서 24시간 소요)"
        else
          echo -e "${RED}IPA 파일 생성 실패. 오류를 확인하세요.${NC}"
          exit 1
        fi
      fi
    else
      echo -e "${YELLOW}개발자 등록이 필요하여 아카이브 생성 단계를 건너뜁니다.${NC}"
      echo -e "${YELLOW}시뮬레이터에서 앱을 테스트하거나 Apple 개발자 계정을 등록하세요.${NC}"
    fi
    
  else
    echo -e "${RED}지원되지 않는 빌드 타입입니다: $BUILD_TYPE${NC}"
    echo -e "${YELLOW}사용법: ./build-ios.sh${NC}"
    exit 1
  fi

  # 빌드 완료 후 인증서 신뢰 안내 표시
  show_certificate_trust_guide
  
  echo -e "${GREEN}빌드 프로세스 완료: $(date)${NC}"
}

# 메인 프로그램 시작
show_main_menu
