import 'package:immich_mobile/domain/models/user.model.dart';
import 'package:immich_mobile/domain/models/user_metadata.model.dart';
import 'package:openapi/api.dart';

// TODO: Move to repository once all classes are refactored
abstract final class UserConverter {
  /// Base user dto used where the complete user object is not required
  static UserDto fromSimpleUserDto(UserResponseDto dto) => UserDto(
        id: dto.id,
        email: dto.email,
        name: dto.name,
        isAdmin: false,
        updatedAt: DateTime.now(),
        profileImagePath: dto.profileImagePath,
        avatarColor: dto.avatarColor.toAvatarColor(),
      );

  static UserDto fromAdminDto(
    UserAdminResponseDto adminDto, [
    UserPreferencesResponseDto? preferenceDto,
  ]) =>
      UserDto(
        id: adminDto.id,
        email: adminDto.email,
        name: adminDto.name,
        isAdmin: adminDto.isAdmin,
        updatedAt: adminDto.updatedAt,
        profileImagePath: adminDto.profileImagePath,
        avatarColor: adminDto.avatarColor.toAvatarColor(),
        memoryEnabled: preferenceDto?.memories.enabled ?? true,
        inTimeline: false,
        isPartnerSharedBy: false,
        isPartnerSharedWith: false,
        quotaUsageInBytes: adminDto.quotaUsageInBytes ?? 0,
        quotaSizeInBytes: adminDto.quotaSizeInBytes ?? 0,
      );

  static UserDto fromPartnerDto(PartnerResponseDto dto) => UserDto(
        id: dto.id,
        email: dto.email,
        name: dto.name,
        isAdmin: false,
        updatedAt: DateTime.now(),
        profileImagePath: dto.profileImagePath,
        avatarColor: dto.avatarColor.toAvatarColor(),
        memoryEnabled: false,
        inTimeline: dto.inTimeline ?? false,
        isPartnerSharedBy: false,
        isPartnerSharedWith: false,
        quotaUsageInBytes: 0,
        quotaSizeInBytes: 0,
      );
}

extension on UserAvatarColor {
  AvatarColor toAvatarColor() => switch (this) {
        UserAvatarColor.red => AvatarColor.red,
        UserAvatarColor.green => AvatarColor.green,
        UserAvatarColor.blue => AvatarColor.blue,
        UserAvatarColor.purple => AvatarColor.purple,
        UserAvatarColor.orange => AvatarColor.orange,
        UserAvatarColor.pink => AvatarColor.pink,
        UserAvatarColor.amber => AvatarColor.amber,
        UserAvatarColor.yellow => AvatarColor.yellow,
        UserAvatarColor.gray => AvatarColor.gray,
        UserAvatarColor.primary || _ => AvatarColor.primary,
      };
}