// Copyright 2013 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 'package:cross_file/cross_file.dart';
import 'package:flutter/services.dart';
import 'package:image_picker_platform_interface/src/types/types.dart';

/// The response object of [ImagePicker.getLostData].
///
/// Only applies to Android.
/// See also:
/// * [ImagePicker.getLostData] for more details on retrieving lost data.
class LostDataResponse {
  /// Creates an instance with the given [file], [exception], and [type]. Any of
  /// the params may be null, but this is never considered to be empty.
  LostDataResponse({this.file, this.exception, this.type});

  /// Initializes an instance with all member params set to null and considered
  /// to be empty.
  LostDataResponse.empty()
      : file = null,
        exception = null,
        type = null,
        _empty = true;

  /// Whether it is an empty response.
  ///
  /// An empty response should have [file], [exception] and [type] to be null.
  bool get isEmpty => _empty;

  /// The file that was lost in a previous [getImage], [getMultiImage] or [getVideo] call due to MainActivity being destroyed.
  ///
  /// Can be null if [exception] exists.
  final XFile? file;

  /// The exception of the last [getImage], [getMultiImage] or [getVideo].
  ///
  /// If the last [getImage], [getMultiImage] or [getVideo] threw some exception before the MainActivity destruction,
  /// this variable keeps that exception.
  /// You should handle this exception as if the [getImage], [getMultiImage] or [getVideo] got an exception when
  /// the MainActivity was not destroyed.
  ///
  /// Note that it is not the exception that caused the destruction of the MainActivity.
  final PlatformException? exception;

  /// Can either be [RetrieveType.image] or [RetrieveType.video];
  ///
  /// If the lost data is empty, this will be null.
  final RetrieveType? type;

  bool _empty = false;
}
