using System;
using System.IO;
using Aspose.Imaging.Cloud.Sdk.Api;
using Aspose.Imaging.Cloud.Sdk.Model;
using Aspose.Imaging.Cloud.Sdk.Model.Requests;

string ImageFileName = "example_image.tiff";
string ImagesFolder = "ExampleImages";
string CloudFolder = "CloudImages";
string OutputFolder = "Output";

// Get ClientId and ClientSecret from https://dashboard.aspose.cloud/ 
// or use on-premise version (https://docs.aspose.cloud/imaging/getting-started/how-to-run-docker-container/)
var api = new ImagingApi(clientSecret, clientId, "https://api.aspose.cloud");

/// <summary>
/// Rotate and/or flip an image from cloud storage.
/// </summary>
public void RotateFlipImageFromStorage()
{
    // Upload image to cloud storage
    using (var localInputImage = File.OpenRead(Path.Combine(ImagesFolder, ImageFileName)))
    {
        var uploadFileRequest = new UploadFileRequest(Path.Combine(CloudFolder, imageName), image);
        var result = api.UploadFile(uploadFileRequest);
        if (result.Errors?.Count > 0)
            throw new Exception($"Uploading errors count: {result.Errors.Count}");
    }

    // Please refer to https://docs.aspose.cloud/imaging/supported-file-formats/#rotateflip
    // for possible formats  
    var format = "tiff"; // Resulting image format.    
    var method = "Rotate90FlipX"; // RotateFlip method
    var folder = CloudFolder; // Input file is saved at the desired folder in the storage
    string storage = null; // We are using default Cloud Storage

    var request = new RotateFlipImageRequest(SampleImageFileName, method, format, folder, storage);
    
    using (var updatedImage = api.RotateFlipImage(request))
    {
        // Save the image file to output folder
        var updatedImageName = Path.ChangeExtension(ImageFileName, "tiff")
        var path = Path.GetFullPath(Path.Combine(OutputFolder, updatedImageName));
        using (var fileStream = File.Create(path))
        {
            updatedImage.Seek(0, SeekOrigin.Begin);
            updatedImage.CopyTo(fileStream);
        }
    }
}

/// <summary>
/// Rotate and/or flip an image. Image data is passed in a request stream.
/// </summary>
public void CreateRotateFlippedImageFromRequest()
{
    using (var inputImageStream = File.OpenRead(Path.Combine(ImagesFolder, ImageFileName)))
    {
        // Please refer to https://docs.aspose.cloud/imaging/supported-file-formats/#rotateflip
        // for possible formats
        var format = "tiff";          
        var method = "Rotate90FlipX"; // RotateFlip method
        string storage = null; // We are using default Cloud Storage
        string outPath = null; // Path to updated file (if this is empty, response contains streamed image)

        var request = new CreateRotateFlippedImageRequest(inputImageStream, method, format, outPath, storage);

        using (var updatedImage = api.CreateRotateFlippedImage(request))
        {           
            // Save the image file to output folder
            var updatedImageName = Path.ChangeExtension(ImageFileName, "tiff")
            var path = Path.GetFullPath(Path.Combine(OutputFolder, updatedImageName));
            using (var fileStream = File.Create(path))
            {
                updatedImage.Seek(0, SeekOrigin.Begin);
                updatedImage.CopyTo(fileStream);
            }
        }
    }
}