I can’t set image ad fatured programatically

I had the same problem and i managed to resolve the issue by using this code.

//insert featured image
function Generate_Featured_Image( $featured_image, $product_id  ){

    $upload_dir = wp_upload_dir();
    $image_data = file_get_contents($featured_image);
    //$filename = basename($featured_image);
    $filename = basename($image_url, '.jpg') . (string) rand(0, 5000) . '.jpg';
    if(wp_mkdir_p($upload_dir['path']))     $file = $upload_dir['path'] . "https://wordpress.stackexchange.com/" . $filename;
    else                                    $file = $upload_dir['basedir'] . "https://wordpress.stackexchange.com/" . $filename;
    file_put_contents($file, $image_data);

    $wp_filetype = wp_check_filetype($filename, null );
    $attachment = array(
        'post_mime_type' => $wp_filetype['type'],
        'post_title' => sanitize_file_name($filename),
        'post_content' => '',
        'post_status' => 'inherit'
    );
    $attach_id = wp_insert_attachment( $attachment, $file, $product_id );
    require_once(ABSPATH . 'wp-admin/includes/image.php');
    $attach_data = wp_generate_attachment_metadata( $attach_id, $file );
    $res1= wp_update_attachment_metadata( $attach_id, $attach_data );
    $res2= set_post_thumbnail( $product_id, $attach_id );
}
Generate_Featured_Image( $featured_image,   $product_id );

what you have to do is to pass parameters upon calling functions.
Code goes to your theme or child-theme’s functions.php file.