// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:convert';
import 'dart:typed_data';

import 'message.dart';

/// Format of data returned by screenshot driver command.
enum ScreenshotFormat {
  /// Raw RGBA format.
  ///
  /// Unencoded bytes, in RGBA row-primary form with premultiplied alpha, 8 bits per channel.
  rawRgba,

  /// Raw straight RGBA format.
  ///
  /// Unencoded bytes, in RGBA row-primary form with straight alpha, 8 bits per channel.
  rawStraightRgba,

  /// Raw unmodified format.
  rawUnmodified,

  /// Raw extended range RGBA format.
  ///
  /// Unencoded bytes, in RGBA row-primary form with straight alpha, 32 bit
  /// float (IEEE 754 binary32) per channel.
  rawExtendedRgba128,

  /// PNG format.
  png,
}

/// A Flutter Driver command that takes a screenshot.
class ScreenshotCommand extends Command {
  /// Constructs this command to take a screenshot.
  ScreenshotCommand({super.timeout, this.format = ScreenshotFormat.png});

  /// Deserializes this command from the value generated by [serialize].
  ScreenshotCommand.deserialize(super.json)
    : format = json.containsKey('format')
          ? ScreenshotFormat.values[int.tryParse(json['format']!) ?? 4]
          : ScreenshotFormat.png,
      super.deserialize();

  /// Whether the resulting data is PNG compressed.
  final ScreenshotFormat format;

  /// Serializes this command to parameter name/value pairs.
  @override
  Map<String, String> serialize() {
    return super.serialize()..addAll(<String, String>{'format': format.index.toString()});
  }

  @override
  String get kind => 'screenshot';
}

/// base64 encode a PNG
class ScreenshotResult extends Result {
  /// Constructs a screenshot result with PNG or raw RGBA byte data.
  ScreenshotResult(this._data);

  final Uint8List _data;

  @override
  Map<String, Object?> toJson() {
    return <String, Object?>{'data': base64.encode(_data)};
  }
}
