import { Injectable } from '@angular/core';
import { HttpClient, HttpParams } from '@angular/common/http';
import { Observable } from 'rxjs';

// 定义用户数据结构
export interface User {
  _id: string;
  uid: string; // 唯一索引
  project: number; // 项目id
  network?: string; // 来源渠道
  campaign?: string; // 设备当前归因推广活动的名称
  adgroup?: string; // 设备当前归因广告组的名称
  creative?: string; // 设备当前归因素材的名称
  prod?: string; // 归属产品 (填色产品，jigsaw产品等)
  libraryName?: string; // 其实就是操作系统，取值android/ios
  cc?: string; // 国家代码
  lang?: string; // 语言
  manufacturer?: string; // 生产厂商
  deviceModel?: string; // 设备型号 (已从 model 更改为 deviceModel)
  deviceInfo?: string; // 设备信息 (已从 device 更改为 deviceInfo)
  hardware?: string; //  硬件信息
  deviceMem?: number; // 机身内存
  apiLevel?: number; // api版本号
  versionName?: string; // 软件版本
  versionCode?: number; // 软件编号
  fmToken?: string; // firebase message token
  tags?: string[]; // 用户画像（基础维度、内容偏好维度、社区属性维度等）
  firstLoginAt?: Date; // 首次登录时间
  lastActiveAt?: Date; // 上次活跃时间
  createdAt: Date;
  updateAt: Date;
}

// 定义后端分页接口返回的数据结构
export interface PaginatedUsersResponse {
  page: number;
  limit: number;
  total: number;
  users: User[];
}

// 定义消息发送的请求体结构
export interface MessagePayload {
  title: string;
  content: string;
  image?: string;
  bigger?: boolean;
  action?: string;
  param?: string;
  extend?: string;
}

// 定义单条消息请求体
export interface SendDirectMessagePayload extends MessagePayload {
  uid: string;
}

// 定义批量消息请求体
export interface SendBulkMessagePayload extends MessagePayload {
  uids: string[];
}

@Injectable({
  providedIn: 'root',
})
export class UserService {
  private apiUrl = '/api/users';

  constructor(private http: HttpClient) {}

  /**
   * 获取用户列表，支持分页和筛选。
   * GET /api/users?page=...&limit=...&...
   * @param page 页码
   * @param limit 每页条数
   * @param filters 筛选参数
   * @returns 包含分页信息和用户列表的 Observable
   */
  getPaginatedUsers(
    page: number,
    limit: number,
    filters: any
  ): Observable<PaginatedUsersResponse> {
    let params = new HttpParams()
      .set('page', page.toString())
      .set('limit', limit.toString());

    // 遍历筛选条件，添加到查询参数中
    for (const key in filters) {
      if (filters.hasOwnProperty(key)) {
        params = params.set(key, filters[key]);
      }
    }

    return this.http.get<PaginatedUsersResponse>(this.apiUrl, { params });
  }

  /**
   * 通过 UID 获取单个用户。
   * GET /api/users/:uid
   * @param uid 用户唯一ID
   * @returns 匹配到的用户 Observable
   */
  getUserByUid(uid: string): Observable<User> {
    return this.http.get<User>(`${this.apiUrl}/${uid}`);
  }

  /**
   * 创建新用户。
   * POST /api/users
   * @param user 要创建的用户对象
   * @returns 新创建的用户 Observable
   */
  createUser(
    user: Omit<User, '_id' | 'createdAt' | 'updateAt'>
  ): Observable<User> {
    return this.http.post<User>(this.apiUrl, user);
  }

  /**
   * 更新用户。
   * PUT /api/users/:uid
   * @param uid 用户唯一ID
   * @param updateData 要更新的数据
   * @returns 更新后的用户 Observable
   */
  updateUser(uid: string, updateData: Partial<User>): Observable<User> {
    return this.http.put<User>(`${this.apiUrl}/${uid}`, updateData);
  }

  /**
   * 删除用户。
   * DELETE /api/users/:uid
   * @param uid 要删除的用户唯一ID
   * @returns 删除操作的 Observable
   */
  deleteUser(uid: string): Observable<void> {
    return this.http.delete<void>(`${this.apiUrl}/${uid}`);
  }

  /**
   * 新增：发送单条消息给指定用户。
   * POST /api/users/send-message
   * @param payload 消息内容和目标用户UID
   * @returns 消息发送结果的 Observable
   */
  sendDirectMessage(payload: SendDirectMessagePayload): Observable<any> {
    return this.http.post<any>(`${this.apiUrl}/send-message`, payload);
  }

  /**
   * 新增：发送批量消息给多个用户。
   * POST /api/users/send-bulk-message
   * @param payload 消息内容和目标用户UID数组
   * @returns 批量消息发送结果的 Observable
   */
  sendBulkMessage(payload: SendBulkMessagePayload): Observable<any> {
    return this.http.post<any>(`${this.apiUrl}/send-bulk-message`, payload);
  }
}
