import 'dart:typed_data';

import 'package:dio/dio.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:http_parser/http_parser.dart';
import 'package:logging/logging.dart';
import 'package:moneymgr_mobile/services/api/api_client.dart';

part 'files_api.freezed.dart';
part 'files_api.g.dart';

@freezed
abstract class UploadResult with _$UploadResult {
  const factory UploadResult({required int id}) = _UploadResult;

  factory UploadResult.fromJson(Map<String, dynamic> json) =>
      _$UploadResultFromJson(json);
}

extension FilesApi on ApiClient {
  /// Upload a file
  Future<UploadResult> uploadFile({
    required String filename,
    required String mimeType,
    required Uint8List bytes,
  }) async {
    final res = await execute(
      "/file",
      method: "POST",
      data: FormData.fromMap({
        "file": MultipartFile.fromBytes(
          bytes,
          filename: filename,
          contentType: MediaType.parse(mimeType),
        ),
      }),
    );

    Logger.root.fine("Successfully uploaded file with response=${res.data}");

    return UploadResult.fromJson(res.data);
  }
}
