pkgname=claude-desktop
version=1.0.0
revision=1
archs="x86_64"
build_style=""
hostmakedepends="p7zip wget icoutils ImageMagick nodejs tar"
depends="nodejs"
short_desc="Claude AI desktop client for Void Linux"
maintainer="Wizzard <retard@bandaholics.cash>"
license="Proprietary"
homepage="https://anthropic.com"
repository="nonfree"
restricted=yes
wrksrc="claude-build"

_claude_url="https://storage.googleapis.com/osprey-downloads-c02f6a0d-347c-492b-a752-3e0651722e97/nest-win-x64/Claude-Setup-x64.exe"

do_fetch() {
    mkdir -p ${wrksrc}
    cd ${wrksrc}
    
    msg_normal "Downloading Claude Desktop installer...\n"
    wget -O "Claude-Setup-x64.exe" "${_claude_url}" || return 1
}

do_extract() {
    cd ${wrksrc}
    
    msg_normal "Extracting resources...\n"
    7z x -y "Claude-Setup-x64.exe" || return 1
    
    local NUPKG_PATH=$(find . -name "AnthropicClaude-*.nupkg" | head -1)
    if [ -z "$NUPKG_PATH" ]; then
        msg_error "Could not find AnthropicClaude nupkg file\n"
        return 1
    fi
    
    version=$(echo "$NUPKG_PATH" | sed -n 's/.*AnthropicClaude-\([0-9]\+\.[0-9]\+\.[0-9]\+\).*/\1/p')
    if [ -z "$version" ]; then
        msg_error "Could not extract version from nupkg filename: $NUPKG_PATH\n"
        return 1
    fi
    msg_normal "Detected Claude version: $version\n"
    
    7z x -y "$NUPKG_PATH" || return 1
    
    msg_normal "Processing icons...\n"
    wrestool -x -t 14 "lib/net45/claude.exe" -o claude.ico || return 1
    icotool -x claude.ico || return 1
}

do_build() {
    cd ${wrksrc}
    
    mkdir -p electron-app
    cp "lib/net45/resources/app.asar" electron-app/ || return 1
    cp -r "lib/net45/resources/app.asar.unpacked" electron-app/ || return 1
    
    cd electron-app
    npm install -g asar || return 1
    asar extract app.asar app.asar.contents || return 1
    
    msg_normal "Creating stub native module...\n"
    mkdir -p app.asar.contents/node_modules/claude-native/ || return 1
    cat > app.asar.contents/node_modules/claude-native/index.js << 'EOF'
const KeyboardKey = {
  Backspace: 43,
  Tab: 280,
  Enter: 261,
  Shift: 272,
  Control: 61,
  Alt: 40,
  CapsLock: 56,
  Escape: 85,
  Space: 276,
  PageUp: 251,
  PageDown: 250,
  End: 83,
  Home: 154,
  LeftArrow: 175,
  UpArrow: 282,
  RightArrow: 262,
  DownArrow: 81,
  Delete: 79,
  Meta: 187
};

Object.freeze(KeyboardKey);

module.exports = {
  getWindowsVersion: () => "10.0.0",
  setWindowEffect: () => {},
  removeWindowEffect: () => {},
  getIsMaximized: () => false,
  flashFrame: () => {},
  clearFlashFrame: () => {},
  showNotification: () => {},
  setProgressBar: () => {},
  clearProgressBar: () => {},
  setOverlayIcon: () => {},
  clearOverlayIcon: () => {},
  KeyboardKey
};
EOF
    
    mkdir -p app.asar.contents/resources || return 1
    mkdir -p app.asar.contents/resources/i18n || return 1
    
    cp ../lib/net45/resources/Tray* app.asar.contents/resources/ || return 1
    cp ../lib/net45/resources/*-*.json app.asar.contents/resources/i18n/ || return 1
    
    cd app.asar.contents
    wget -O main_window.tgz https://github.com/emsi/claude-desktop/raw/refs/heads/main/assets/main_window.tgz || return 1
    tar -zxvf main_window.tgz || return 1
    rm main_window.tgz
    cd ..
    
    asar pack app.asar.contents app.asar || return 1
}

do_install() {
    cd ${wrksrc}
    
    vmkdir usr/lib/${pkgname}
    vinstall electron-app/app.asar 644 usr/lib/${pkgname}
    vcopy electron-app/app.asar.unpacked usr/lib/${pkgname}
    
    vmkdir usr/lib/${pkgname}/app.asar.unpacked/node_modules/claude-native
    cat > ${DESTDIR}/usr/lib/${pkgname}/app.asar.unpacked/node_modules/claude-native/index.js << 'EOF'
const KeyboardKey = {
  Backspace: 43,
  Tab: 280,
  Enter: 261,
  Shift: 272,
  Control: 61,
  Alt: 40,
  CapsLock: 56,
  Escape: 85,
  Space: 276,
  PageUp: 251,
  PageDown: 250,
  End: 83,
  Home: 154,
  LeftArrow: 175,
  UpArrow: 282,
  RightArrow: 262,
  DownArrow: 81,
  Delete: 79,
  Meta: 187
};

Object.freeze(KeyboardKey);

module.exports = {
  getWindowsVersion: () => "10.0.0",
  setWindowEffect: () => {},
  removeWindowEffect: () => {},
  getIsMaximized: () => false,
  flashFrame: () => {},
  clearFlashFrame: () => {},
  showNotification: () => {},
  setProgressBar: () => {},
  clearProgressBar: () => {},
  setOverlayIcon: () => {},
  clearOverlayIcon: () => {},
  KeyboardKey
};
EOF
    
    declare -A icon_files=(
        ["16"]="claude_13_16x16x32.png"
        ["24"]="claude_11_24x24x32.png"
        ["32"]="claude_10_32x32x32.png"
        ["48"]="claude_8_48x48x32.png"
        ["64"]="claude_7_64x64x32.png"
        ["256"]="claude_6_256x256x32.png"
    )
    
    for size in 16 24 32 48 64 256; do
        if [ -f "${icon_files[$size]}" ]; then
            vmkdir usr/share/icons/hicolor/${size}x${size}/apps
            vinstall "${icon_files[$size]}" 644 usr/share/icons/hicolor/${size}x${size}/apps claude-desktop.png
        fi
    done
    
    vmkdir usr/share/applications
    vinstall ${FILESDIR}/claude-desktop.desktop 644 usr/share/applications
    
    vmkdir usr/bin
    vinstall ${FILESDIR}/claude-desktop 755 usr/bin
}

post_install() {
    vlicense ${FILESDIR}/LICENSE
    
    if [ -f "${DESTDIR}/usr/lib/${pkgname}/node_modules/electron/dist/chrome-sandbox" ]; then
        chmod 4755 ${DESTDIR}/usr/lib/${pkgname}/node_modules/electron/dist/chrome-sandbox
    fi
}