<?php
/**
 * Remote plugin updater: accepts a ZIP from the panel and replaces plugin files.
 */

if ( ! defined( 'ABSPATH' ) ) exit;

class Flavor_Updater {

    public function __construct() {
        // No hooks needed — called explicitly via API
    }

    /**
     * Process an update request.
     *
     * @param WP_REST_Request|array $request  Request with 'zip_url' param.
     * @return true|string  True on success, error message on failure.
     */
    public function process_update( $request ) {
        $zip_url = '';
        if ( is_object( $request ) && method_exists( $request, 'get_param' ) ) {
            $zip_url = $request->get_param( 'zip_url' );
        } elseif ( is_array( $request ) ) {
            $zip_url = isset( $request['zip_url'] ) ? $request['zip_url'] : '';
        }

        if ( empty( $zip_url ) ) {
            return 'zip_url required';
        }

        if ( ! function_exists( 'download_url' ) ) {
            require_once ABSPATH . 'wp-admin/includes/file.php';
        }

        $tmp_file = download_url( $zip_url );
        if ( is_wp_error( $tmp_file ) ) {
            return 'download failed: ' . $tmp_file->get_error_message();
        }

        WP_Filesystem();
        global $wp_filesystem;

        $plugin_dir  = WP_PLUGIN_DIR . '/flavor';
        $extract_dir = WP_PLUGIN_DIR . '/flavor-update-tmp';

        $unzip = unzip_file( $tmp_file, $extract_dir );
        @unlink( $tmp_file );

        if ( is_wp_error( $unzip ) ) {
            $wp_filesystem->delete( $extract_dir, true );
            return 'unzip failed: ' . $unzip->get_error_message();
        }

        $source = $extract_dir . '/flavor';
        if ( ! is_dir( $source ) ) {
            $dirs = glob( $extract_dir . '/*', GLOB_ONLYDIR );
            if ( ! empty( $dirs ) ) {
                $source = $dirs[0];
            } else {
                $source = $extract_dir;
            }
        }

        if ( is_dir( $plugin_dir ) ) {
            $wp_filesystem->delete( $plugin_dir, true );
        }

        $wp_filesystem->move( $source, $plugin_dir );
        $wp_filesystem->delete( $extract_dir, true );

        return true;
    }
}
