/**
 * 微信视频号登录服务
 * @module services/login/WeixinVideoLoginService
 * 
 * 登录流程（按用户要求）：
 * 1. 打开 https://channels.weixin.qq.com/login.html
 * 2. 等待用户扫码登录，跳转到 /platform 或 AI 识别已登录
 * 3. 监听 API /cgi-bin/mmfinderassistant-bin/auth/auth_data 获取：
 *    - finderUser.headImgUrl (头像)
 *    - finderUser.nickname (昵称)
 *    - finderUser.uniqId (视频号ID)
 *    - finderUser.fansCount (粉丝数)
 *    - finderUser.feedsCount (作品数)
 * 4. 完成后发送事件，账号ID使用 sph_ 前缀
 */

import { logger } from '../../utils/logger.js';
import { BaseLoginService, type ApiInterceptConfig } from './BaseLoginService.js';
import type { AccountInfo, LoginSession } from './types.js';

export class WeixinVideoLoginService extends BaseLoginService {
  constructor() {
    super({
      platform: 'weixin_video',
      displayName: '视频号',
      loginUrl: 'https://channels.weixin.qq.com/login.html',
      successIndicators: ['/platform', 'channels.weixin.qq.com/platform'],
      cookieDomain: '.weixin.qq.com',
      accountIdPrefix: 'sph_',
    });
  }

  /**
   * API 拦截配置 - 视频号所有信息都在 auth_data 接口
   */
  protected override getApiInterceptConfigs(): ApiInterceptConfig[] {
    return [
      {
        urlPattern: '/cgi-bin/mmfinderassistant-bin/auth/auth_data',
        dataKey: 'authData',
        handler: (data: any) => {
          const user = data.data?.finderUser || data.finderUser || {};
          return {
            headImgUrl: user.headImgUrl,
            nickname: user.nickname,
            uniqId: user.uniqId,
            fansCount: user.fansCount || 0,
            feedsCount: user.feedsCount || 0,
          };
        },
      },
    ];
  }

  /**
   * 收集账号信息
   */
  protected override async collectAccountInfo(session: LoginSession): Promise<AccountInfo | null> {
    try {
      // 步骤3: 等待 auth_data API 数据（包含所有信息）
      logger.info('[视频号] 等待 auth_data API...');
      let authData = await this.waitForApiData(session, 'authData', 10000);

      // 如果没拿到，刷新页面重试
      if (!authData) {
        logger.info('[视频号] 未拿到数据，刷新页面重试...');
        await session.page.reload({ waitUntil: 'domcontentloaded' });
        authData = await this.waitForApiData(session, 'authData', 10000);
      }

      if (!authData?.uniqId) {
        logger.error('[视频号] 无法获取视频号ID');
        return null;
      }

      logger.info('[视频号] 账号信息:', authData);

      // 步骤4: 组装账号信息，使用 sph_ 前缀
      return {
        accountId: `sph_${authData.uniqId}`,
        accountName: authData.nickname || '视频号用户',
        avatarUrl: authData.headImgUrl || '',
        fansCount: authData.fansCount || 0,
        worksCount: authData.feedsCount || 0,
      };
    } catch (error) {
      logger.error('[视频号] 收集账号信息失败:', error);
      return null;
    }
  }
}

// 导出单例
export const weixinVideoLoginService = new WeixinVideoLoginService();
