using NAPS2.Images.Gdi;
using NAPS2.Scan;

namespace NAPS2.Sdk.Samples;

public class TwainSample
{
    public static async Task Run()
    {
        // Scanning with TWAIN on Windows must happen from a 32-bit process. You can do this by building your exe as
        // 32-bit, but the better solution is to install the NAPS2.Sdk.Worker.Win32 Nuget package, which includes a
        // pre-compiled 32-bit NAPS2.Worker.exe. Then you only need to call ScanningContext.SetUpWin32Worker and you
        // should be able to scan with TWAIN.
        //
        // If you want to use a worker process but don't want to use a pre-compiled exe (or want to set up your own
        // logging etc), you can also build your own worker exe with the same name (and call WorkerServer.Run in its
        // Main method).

        using var scanningContext = new ScanningContext(new GdiImageContext());

        // Set up the worker; this includes starting a worker process in the background so it will be ready to respond
        // when we need it
        scanningContext.SetUpWin32Worker();

        var controller = new ScanController(scanningContext);

        // As we're not using the default (WIA) driver, we need to specify it when listing devices or scanning
        ScanDevice device = (await controller.GetDeviceList(Driver.Twain)).First();
        var options = new ScanOptions { Device = device };

        await foreach (var image in controller.Scan(options))
        {
            Console.WriteLine("Scanned a page!");
        }
    }
}