import 'package:nc_photos/entity/file.dart';
import 'package:np_api/np_api.dart' as api;
import 'package:np_string/np_string.dart';
import 'package:to_string/to_string.dart';

part 'nc_album_item.g.dart';

@ToString(ignoreNull: true)
class NcAlbumItem {
  const NcAlbumItem({
    required this.path,
    required this.fileId,
    this.contentLength,
    this.contentType,
    this.etag,
    this.lastModified,
    this.hasPreview,
    this.isFavorite,
    this.fileMetadataWidth,
    this.fileMetadataHeight,
  });

  @override
  String toString() => _$toString();

  final String path;
  final int fileId;
  final int? contentLength;
  final String? contentType;
  final String? etag;
  final DateTime? lastModified;
  final bool? hasPreview;
  final bool? isFavorite;
  final int? fileMetadataWidth;
  final int? fileMetadataHeight;
}

extension NcAlbumItemExtension on NcAlbumItem {
  /// Return the path of this file with the DAV part stripped
  ///
  /// WebDAV file path: remote.php/dav/photos/{userId}/albums/{album}/{strippedPath}.
  /// If this path points to the user's root album path, return "."
  String get strippedPath {
    // [albums/sharedalbums]/{album}/{strippedPath}
    final p = _partialStrippedPath;
    var begin = 0;
    if (p.startsWith("albums")) {
      begin += 6;
    } else if (p.startsWith("sharedalbums")) {
      begin += 12;
    } else {
      throw ArgumentError("Unsupported path: $path");
    }
    begin += 1;
    // {album}/{strippedPath}
    begin = path.indexOf("/", begin);
    if (begin == -1) {
      return ".";
    }
    return path.slice(begin + 1);
  }

  bool compareIdentity(NcAlbumItem other) => fileId == other.fileId;

  int get identityHashCode => fileId.hashCode;

  File toFile() {
    Metadata? metadata;
    if (fileMetadataWidth != null && fileMetadataHeight != null) {
      metadata = Metadata(
        imageWidth: fileMetadataWidth,
        imageHeight: fileMetadataHeight,
      );
    }
    return File(
      path: path,
      fileId: fileId,
      contentLength: contentLength,
      contentType: contentType,
      etag: etag,
      lastModified: lastModified,
      hasPreview: hasPreview,
      isFavorite: isFavorite,
      metadata: metadata,
    );
  }

  /// Return a new path without the part before albums/sharedalbums
  String get _partialStrippedPath {
    if (!path.startsWith("${api.ApiPhotos.path}/")) {
      throw ArgumentError("Unsupported path: $path");
    }
    var begin = "${api.ApiPhotos.path}/".length;
    begin = path.indexOf("/", begin);
    if (begin == -1) {
      throw ArgumentError("Unsupported path: $path");
    }
    return path.slice(begin + 1);
  }
}