/**
 * 用户数据映射器
 * 负责 User 模型与 API 响应、数据库记录之间的转换
 */

import { UserModel } from '../models';
import type { UserDTO } from '../../types/dto';

// 数据库用户记录类型
export interface UserDbRecord {
  id: string;
  data: string;
  updatedAt: string;
}

export class UserMapper {
  static fromDTO(dto: UserDTO): UserModel {
    return {
      id: String(dto.id || ''),
      username: dto.username || '',
      nickname: dto.nickname,
      avatar: dto.avatar,
      bio: dto.bio,
      website: dto.website,
      location: dto.location,
      email: dto.email,
      phone: dto.phone,
      followersCount: dto.followers_count,
      followingCount: dto.following_count,
      postsCount: dto.posts_count,
      isFollowing: dto.is_following,
      createdAt: dto.created_at ? new Date(dto.created_at) : undefined,
    };
  }

  static fromDTOList(dtos: UserDTO[]): UserModel[] {
    return dtos.map(dto => this.fromDTO(dto));
  }

  /**
   * 从数据库记录转换为应用模型
   */
  static fromDbRecord(record: UserDbRecord): UserModel | null {
    try {
      const data = JSON.parse(record.data) as UserDTO;
      return this.fromDTO(data);
    } catch {
      return null;
    }
  }

  /**
   * 将应用模型转换为数据库记录
   */
  static toDbRecord(model: UserModel): UserDbRecord {
    const dto: UserDTO = {
      id: model.id,
      username: model.username,
      nickname: model.nickname || '',
      avatar: model.avatar || '',
      cover_url: '',
      bio: model.bio || '',
      website: model.website || '',
      location: model.location || '',
      email: model.email,
      phone: model.phone,
      followers_count: model.followersCount || 0,
      following_count: model.followingCount || 0,
      posts_count: model.postsCount || 0,
      is_following: model.isFollowing,
      created_at: model.createdAt?.toISOString() || '',
    };

    return {
      id: model.id,
      data: JSON.stringify(dto),
      updatedAt: new Date().toISOString(),
    };
  }

  /**
   * 将应用模型转换为 API 请求数据
   */
  static toApiRequest(model: Partial<UserModel>): Record<string, any> {
    const request: Record<string, any> = {};

    if (model.nickname !== undefined) {
      request.nickname = model.nickname;
    }
    if (model.avatar !== undefined) {
      request.avatar = model.avatar;
    }
    if (model.bio !== undefined) {
      request.bio = model.bio;
    }
    if (model.website !== undefined) {
      request.website = model.website;
    }
    if (model.location !== undefined) {
      request.location = model.location;
    }
    if (model.phone !== undefined) {
      request.phone = model.phone;
    }
    if (model.email !== undefined) {
      request.email = model.email;
    }

    return request;
  }

  /**
   * 将应用模型转换为 DTO
   */
  static toDTO(model: UserModel): UserDTO {
    return {
      id: model.id,
      username: model.username,
      nickname: model.nickname || '',
      avatar: model.avatar || '',
      cover_url: '',
      bio: model.bio || '',
      website: model.website || '',
      location: model.location || '',
      email: model.email,
      phone: model.phone,
      followers_count: model.followersCount || 0,
      following_count: model.followingCount || 0,
      posts_count: model.postsCount || 0,
      is_following: model.isFollowing,
      created_at: model.createdAt?.toISOString() || '',
    };
  }
}
