<?php
// A2c云控

require_once __DIR__ . '/AbstractScrmSpider.class.php';

class Haiwang extends AbstractScrmSpider
{
    const API_LIST  = '/webApi/accountshow/list';    // 列表API地址
    const API_DETAILS = '';       // 详情API地址
    const API_COUNT = '';                                       // 总数API地址
    const DEFAULT_PER_PAGE_COUNT = 10;                          // List默认每页显示的数量
    private $pageUrl;
    private $account;
    private $password;
    private $unifiedData;
    
    // 实例化时动态传入账号和密码
    public function __construct($pageUrl, $account, $password, $nodeHost = 'http://127.0.0.1:3001')
    {
        parent::__construct($nodeHost);
        $this->account = $account;
        $this->password = $password;
        $this->pageUrl = $pageUrl;
        
        $this->unifiedData = new UnifiedScrmData();
    }

    protected function getSpiderConfig()
    {
        return [
            'pageUrl' => $this->pageUrl,
            'apiUrls' => [self::API_LIST, self::API_DETAILS],
            
            // 明确指派角色
            'listApi'   => self::API_LIST,                  // 必须
            'detailApi' => self::API_DETAILS,               // 选填
            'listMethod' => 'POST',
            'paginationMode' => self::MODE_UI,
            'authActions' => [
                ['type' => 'type', 'selector' => 'input[type="password"]', 'value' => $this->password],
                // ['type' => 'type', 'selector' => '#username_input', 'value' => $this->account],
                ['type' => 'press', 'key' => 'Enter'],
                
                ['type' => 'wait', 'ms' => 2000]
            ]
        ];
    }

    // 只负责解析 List 的总页数
    protected function extractListTotalPages($listFirstPageData, $countData = null)
    {
        $default_per_page_count = self::DEFAULT_PER_PAGE_COUNT;
        $this->unifiedData->total = $listFirstPageData['data']['total'];
        
        if($this->unifiedData->total <= $default_per_page_count) {
            return 1;
        }
        
        return ceil($this->unifiedData->total/$default_per_page_count);
    }

    // 只负责组装 List 的翻页参数
    protected function buildListPageParams($page)
    {
        return ['page' => $page, 'limit' => self::DEFAULT_PER_PAGE_COUNT];
    }

    // 提供 List 的下一页按钮信息
    protected function getUiPaginationConfig()
    {
        return [
            'nextBtnSelector' => '.btn-next', 
            'waitMs'          => 2000
        ];
    }

    // 清爽至极的数据清洗：详情是详情，列表是列表
    protected function parseToUnifiedData($detailData, $allListPagesData)
    {
        $unifiedData = $this->unifiedData;

        // 循环合并了所有页数的 List 数组
        foreach ($allListPagesData as $pageRaw) {
            $records = $pageRaw['data']['items'] ?? [];
            foreach ($records as $item) {
                if(!empty($item['acclist_account'])) {
                    $number = $item['acclist_account'] ?? null;
                    $isOnline = (isset($item['acclist_status']) && $item['acclist_status'] == 2);
                    
                    $unifiedData->addNumber($number, $isOnline, $item['account_statistics_today_effective']);
                }
            }
        }
        $unifiedData->todayNewCount = $allListPagesData[0]['data']['shareStatistics']['sharecode_statistics_today_contact_effective'];
        
        return $unifiedData;
    }
}