import 'package:drift/drift.dart';
import 'package:im_app/data/local/drift/app_database.dart';
import 'package:im_app/domain/entities/sound.dart';

/// 音效 DTO
class SoundDto {
  final int id;
  final String filePath;
  final int typ;
  final String name;
  final int createdAt;
  final int updatedAt;
  final int deletedAt;
  final int channelGroupId;
  final int isDefault;

  const SoundDto({
    required this.id,
    this.filePath = '',
    required this.typ,
    this.name = '',
    required this.createdAt,
    required this.updatedAt,
    this.deletedAt = 0,
    required this.channelGroupId,
    required this.isDefault,
  });

  factory SoundDto.fromJson(Map<String, dynamic> json) => SoundDto(
    id: json['id'] as int,
    filePath: json['file_path'] ?? '',
    typ: json['typ'] as int,
    name: json['name'] ?? '',
    createdAt: json['created_at'] as int,
    updatedAt: json['updated_at'] as int,
    deletedAt: json['deleted_at'] ?? 0,
    channelGroupId: json['channel_group_id'] as int,
    isDefault: json['is_default'] as int,
  );

  Map<String, dynamic> toJson() => {
    'id': id,
    'file_path': filePath,
    'typ': typ,
    'name': name,
    'created_at': createdAt,
    'updated_at': updatedAt,
    'deleted_at': deletedAt,
    'channel_group_id': channelGroupId,
    'is_default': isDefault,
  };

  Sound toEntity() => Sound(
    id: id,
    filePath: filePath,
    typ: typ,
    name: name,
    createdAt: createdAt,
    updatedAt: updatedAt,
    deletedAt: deletedAt,
    channelGroupId: channelGroupId,
    isDefault: isDefault,
  );

  factory SoundDto.fromEntity(Sound sound) => SoundDto(
    id: sound.id,
    filePath: sound.filePath,
    typ: sound.typ,
    name: sound.name,
    createdAt: sound.createdAt,
    updatedAt: sound.updatedAt,
    deletedAt: sound.deletedAt,
    channelGroupId: sound.channelGroupId,
    isDefault: sound.isDefault,
  );

  SoundsCompanion toCompanion() => SoundsCompanion(
    id: Value(id),
    filePath: Value(filePath),
    typ: Value(typ),
    name: Value(name),
    createdAt: Value(createdAt),
    updatedAt: Value(updatedAt),
    deletedAt: Value(deletedAt),
    channelGroupId: Value(channelGroupId),
    isDefault: Value(isDefault),
  );
}