#!/bin/bash
# Pixel 7 Pro NetHunter Setup Script
# This script automates the rooting and setup process
# Usage: ./setup-nethunter.sh [phase]
# Phases: backup, unlock, root, modules, verify, kernel, nethunter

set -euo pipefail

# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
BACKUP_DIR="$PROJECT_DIR/backups"
IMG_DIR="$PROJECT_DIR/images"

log() { echo -e "${GREEN}[+]${NC} $1"; }
warn() { echo -e "${YELLOW}[!]${NC} $1"; }
err() { echo -e "${RED}[-]${NC} $1"; }

check_adb() {
    if ! command -v adb &>/dev/null; then
        err "adb not found. Install Android SDK platform-tools."
        exit 1
    fi
    if ! command -v fastboot &>/dev/null; then
        err "fastboot not found. Install Android SDK platform-tools."
        exit 1
    fi
}

check_device() {
    local device
    device=$(adb shell getprop ro.product.device 2>/dev/null | tr -d '\r')
    if [[ "$device" != "cheetah" ]]; then
        err "This script is for Pixel 7 Pro (cheetah). Detected: $device"
        exit 1
    fi
}

phase_backup() {
    log "Phase: Backup current partitions"
    mkdir -p "$BACKUP_DIR"
    
    check_adb
    check_device
    
    local slot
    slot=$(adb shell getprop ro.boot.slot_suffix 2>/dev/null | tr -d '\r')
    log "Active slot: $slot"
    
    local slot_suffix="${slot#_}"
    : "${slot_suffix:=a}"
    
    log "Backing up boot partitions..."
    adb shell su -c "dd if=/dev/block/by-name/init_boot_${slot_suffix} of=/sdcard/init_boot_backup.img" 2>/dev/null
    adb shell su -c "dd if=/dev/block/by-name/boot_${slot_suffix} of=/sdcard/boot_backup.img" 2>/dev/null
    adb shell su -c "dd if=/dev/block/by-name/vbmeta_${slot_suffix} of=/sdcard/vbmeta_backup.img" 2>/dev/null
    adb shell su -c "dd if=/dev/block/by-name/vendor_boot_${slot_suffix} of=/sdcard/vendor_boot_backup.img" 2>/dev/null
    
    adb pull /sdcard/init_boot_backup.img "$BACKUP_DIR/"
    adb pull /sdcard/boot_backup.img "$BACKUP_DIR/"
    adb pull /sdcard/vbmeta_backup.img "$BACKUP_DIR/"
    adb pull /sdcard/vendor_boot_backup.img "$BACKUP_DIR/"
    
    # Save build info
    {
        echo "=== Pixel 7 Pro Build Info ==="
        echo "Date: $(date)"
        adb shell getprop ro.build.display.id
        adb shell getprop ro.build.id
        adb shell getprop ro.build.version.incremental
        adb shell getprop ro.boot.slot_suffix
        adb shell uname -r
    } > "$BACKUP_DIR/build-info.txt" 2>/dev/null
    
    log "Backups saved to $BACKUP_DIR/"
    log "Build info saved to $BACKUP_DIR/build-info.txt"
}

phase_unlock() {
    log "Phase: Unlock bootloader"
    warn "This will WIPE ALL DATA on the device!"
    read -p "Continue? (yes/no): " confirm
    [[ "$confirm" == "yes" ]] || { err "Aborted"; exit 1; }
    
    check_adb
    
    log "Rebooting to bootloader..."
    adb reboot bootloader
    
    log "Waiting for fastboot..."
    sleep 5
    fastboot devices
    
    log "Unlocking bootloader..."
    fastboot flashing unlock
    
    warn "Confirm unlock on device using volume keys."
    warn "Device will wipe and reboot."
    warn "After reboot, re-enable USB debugging and run: $0 root"
}

phase_root() {
    log "Phase: Root with Magisk (init_boot method)"
    
    check_adb
    check_device
    
    local factory_img
    read -p "Path to matching factory image init_boot.img: " factory_img
    [[ -f "$factory_img" ]] || { err "File not found: $factory_img"; exit 1; }
    
    local magisk_apk
    read -p "Path to Magisk v27+ APK: " magisk_apk
    [[ -f "$magisk_apk" ]] || { err "File not found: $magisk_apk"; exit 1; }
    
    log "Installing Magisk APK..."
    adb install "$magisk_apk"
    
    log "Pushing init_boot.img to device..."
    adb push "$factory_img" /sdcard/Download/init_boot.img
    
    warn "Now open Magisk app on device:"
    warn "  1. Tap 'Install' next to Magisk"
    warn "  2. Select 'Select and Patch a File'"
    warn "  3. Choose /sdcard/Download/init_boot.img"
    warn "  4. Tap 'Let's Go' / 'Done'"
    warn ""
    warn "Press Enter when done patching..."
    read -r
    
    log "Pulling patched image..."
    local patched
    patched=$(adb shell ls /sdcard/Download/magisk_patched-*.img 2>/dev/null | tr -d '\r' | head -1)
    [[ -z "$patched" ]] && { err "Patched image not found. Did you patch in Magisk?"; exit 1; }
    
    adb pull "$patched" "$IMG_DIR/magisk_patched-init_boot.img"
    
    local vbmeta
    read -p "Path to vbmeta.img from factory image: " vbmeta
    cp "$vbmeta" "$IMG_DIR/vbmeta.img" 2>/dev/null || true
    
    log "Rebooting to bootloader..."
    adb reboot bootloader
    sleep 5
    
    log "Flashing patched init_boot..."
    fastboot flash init_boot "$IMG_DIR/magisk_patched-init_boot.img"
    
    if [[ -f "$IMG_DIR/vbmeta.img" ]]; then
        log "Flashing vbmeta with verification disabled..."
        fastboot flash vbmeta --disable-verification "$IMG_DIR/vbmeta.img"
    else
        warn "No vbmeta.img found. You may need to disable verification manually."
    fi
    
    log "Rebooting..."
    fastboot reboot
    
    warn "First boot will take 5-10 minutes. Be patient."
    warn "Once booted, verify root with: adb shell su -c id"
}

phase_modules() {
    log "Phase: Install essential Magisk modules"
    
    check_adb
    
    local pif_apk tricky_apk
    read -p "Path to PlayIntegrityFix module ZIP: " pif_apk
    read -p "Path to TrickyStore module ZIP: " tricky_apk
    
    [[ -f "$pif_apk" ]] && adb push "$pif_apk" /sdcard/ && \
        adb shell su -c "magisk --install-module /sdcard/$(basename "$pif_apk")"
    
    [[ -f "$tricky_apk" ]] && adb push "$tricky_apk" /sdcard/ && \
        adb shell su -c "magisk --install-module /sdcard/$(basename "$tricky_apk")"
    
    log "Modules installed. Rebooting..."
    adb reboot
    
    warn "After reboot, check Play Integrity with a checker app."
}

phase_verify() {
    log "Phase: Verify root and system info"
    
    check_adb
    
    echo "=== Device Info ==="
    adb shell getprop ro.product.device
    adb shell getprop ro.build.display.id
    adb shell getprop ro.boot.slot_suffix
    adb shell uname -r
    
    echo ""
    echo "=== Root Check ==="
    if adb shell su -c id 2>/dev/null | grep -q "uid=0"; then
        log "Root: WORKING"
    else
        err "Root: NOT WORKING"
    fi
    
    echo ""
    echo "=== Magisk Version ==="
    adb shell su -c "magisk -V" 2>/dev/null || warn "Magisk not found"
    
    echo ""
    echo "=== WiFi ==="
    adb shell su -c "iw phy0 info" 2>/dev/null | grep -i monitor || warn "No monitor mode support detected"
    
    echo ""
    echo "=== Partition Info ==="
    local slot
    slot=$(adb shell getprop ro.boot.slot_suffix 2>/dev/null | tr -d '\r' | sed 's/_//')
    : "${slot:=a}"
    adb shell su -c "ls -la /dev/block/by-name/init_boot_${slot}"
    adb shell su -c "ls -la /dev/block/by-name/boot_${slot}"
}

case "${1:-help}" in
    backup)   phase_backup ;;
    unlock)   phase_unlock ;;
    root)     phase_root ;;
    modules)  phase_modules ;;
    verify)   phase_verify ;;
    help)
        echo "Pixel 7 Pro NetHunter Setup Script"
        echo ""
        echo "Usage: $0 <phase>"
        echo ""
        echo "Phases:"
        echo "  backup   - Backup current boot partitions and build info"
        echo "  unlock   - Unlock bootloader (WIPES ALL DATA)"
        echo "  root     - Root with Magisk (init_boot method)"
        echo "  modules  - Install essential Magisk modules (PIF, TrickyStore)"
        echo "  verify   - Verify root and system info"
        echo ""
        echo "Run phases in order: backup → unlock → root → modules → verify"
        echo "Then follow 03-KERNEL-BUILD.md and 04-NETHUNTER.md for custom kernel + NetHunter"
        ;;
    *)
        err "Unknown phase: $1"
        echo "Run '$0 help' for usage."
        exit 1
        ;;
esac