<?php

declare(strict_types=1);
namespace App\Controller;

use App\JsonRpc\CollectorServiceInterface;
use App\Tools\PublicData;
use Hyperf\Di\Annotation\Inject;
use Hyperf\HttpServer\Annotation\AutoController;
use App\Tools\Result;
use Hyperf\Validation\Contract\ValidatorFactoryInterface;
use App\Constants\ErrorCode;
use Hyperf\Context\Context;
//use App\Service\GatherQueueService;
use App\Service\ImportQueueService;
/**
 * ClassCollectorController
 * @package App\Controller
 */

class CollectorController extends AbstractController
{
    #[Inject]
    protected ValidatorFactoryInterface $validationFactory;
//    #[Inject]
//    protected GatherQueueService $Gservice;
    #[Inject]
    protected ImportQueueService $Iservice;

    /**
     * @var CollectorServiceInterface
     */
    #[Inject]
    private $collectorServiceClient;
 
    /**
     * 添加网站
     * @return array
     */
    public function addWeb()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'name'=> 'required',
                'url'=> 'required',
            ],
            [
                'name.required' => '网站名称不能为空',
                'url.required' => '网站地址不能为空',
            ]
        );
        if ($validator->fails()) {
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }


        
        $result = $this->collectorServiceClient->addWeb($requireData);
        if ($result['code'] != ErrorCode::SUCCESS) {
            return Result::error($result['message'],0,[]);
        }
        return Result::success($result['data']);
    }
     /**
     * 获取及搜索网站
     * @return array
     */
    public function getWeb()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'page'=> 'required',
                'pageSize'=> 'required',
            ],
            [
                'page.required' => '第几页不能为空',
                'pageSize.required' => '每页显示条数不能为空',
            ]
        );
        if(isset($requireData['keyWord'])){
            $validator = $this->validationFactory->make(
                $requireData,
                [
                    'keyWord'=> 'required'
                ],
                [
                    'keyWord.required' => '搜索词不能为空'
                ]
            );
        }
        
        if ($validator->fails()) {
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }        
        $result = $this->collectorServiceClient->getWeb($requireData);
        if ($result['code'] != ErrorCode::SUCCESS) {
            return Result::error($result['message'],0,[]);
        }
        return Result::success($result['data']);
    }
    /**
     * 修改网站
     * @return array
     */
    public function upWeb()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'name'=> 'required',
                'url'=> 'required',
                'id' => 'required'
            ],
            [
                'name.required' => '网站名称不能为空',
                'url.required' => '网站地址不能为空',
                'id.required' => '网站id不能为空'
            ]
        );        
        if ($validator->fails()) {
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }        
        $result = $this->collectorServiceClient->upWeb($requireData);
        if ($result['code'] != ErrorCode::SUCCESS) {
            return Result::error($result['message'],0,[]);
        }
        return Result::success($result['data']);
    }
    /**
     * 删除网站 
     * @return array
     */
    public function delWeb()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'id' => 'required'
            ],
            [
                'id.required' => '网站id不能为空'
            ]
        );        
        if ($validator->fails()) {
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }        
        $result = $this->collectorServiceClient->delWeb($requireData);
        if ($result['code'] != ErrorCode::SUCCESS) {
            return Result::error($result['message'],0,[]);
        }
        return Result::success($result['data']);
    }
    
    /**
     * 添加规则任务
     * @return array
     */

    public function addRule()
    {
        
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'name' => 'required',
                'web_id' => 'required',
                'type' => 'required'
            ],
            [
                'name.required' => '任务规则名称不能为空',
                'web_id.required' => '网站id不能为空',
                'type.required' => '网站类型不能为空'
            ]
        );  
        if ($validator->fails()) {
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }
        switch($requireData['type']){
            case 1:
                $validator = $this->validationFactory->make(
                    $requireData,
                    [
                        'first_url' => 'required',
                        'second_start' => 'required',
                        'second_num' => 'required',
                        'second_end' => 'required',
                        'end_pagenum' => 'required',
                        'start' => 'required',
                        'con_url' => 'required',
                        'title' => 'required',
                        'content' => 'required'
                    ],
                    [
                        'first_url.required' => '第1页网址不能为空',
                        'second_start.required' => '第2页网址开头不能为空',
                        'second_num.required' => '第2页代码页数不能为空',
                        'second_end.required' => '第2页网址结束字符串不能为空',
                        'end_pagenum.required' => '列表页结束页码不能为空',
                        'start.required' => '开始代码不能为空',
                        'con_url.required' => '详情页前缀地址不能为空',
                        'title.required' => '标题标签类名不能为空',
                        'content.required' => '内容标签类名不能为空'
                    ]
                ); 
                if ($validator->fails()) {
                    $errorMessage = $validator->errors()->first();
                    return Result::error($errorMessage);
                } 

                break; 
            case 2:
                $validator = $this->validationFactory->make(
                    $requireData,
                    [
                        'first_url' => 'required',
                        'parameter' => 'required',
                        'start' => 'required',
                        'title' => 'required',
                        'content' => 'required',
                    ],
                    [
                        'first_url.required' => '开始采集地址不能为空',
                        'parameter.required' => '接口参数不能为空',
                        'start.required' => '列表标签不能为空',
                        'title.required' => '标题标签不能为空',
                        'content.required' => '内容标签不能为空'
                    ]
                );  
                if ($validator->fails()) {
                    $errorMessage = $validator->errors()->first();
                    return Result::error($errorMessage);
                }  
                // var_dump("============2============");                    
                break;
            case 3:
                $validator = $this->validationFactory->make(
                    $requireData,
                    [
                        'diy_rule' => 'required'
                    ],
                    [
                        'diy_rule.required' => '采集规则不能为空'
                    ]
                ); 
                if ($validator->fails()) {
                    $errorMessage = $validator->errors()->first();
                    return Result::error($errorMessage);
                }  
                // var_dump("============3============");  
                break;
            default:
                return Result::error('请输入正确的网站类型');
                break;
                
        }

        if(isset($requireData['writer_class']) && $requireData['type'] == 2){
            $validator = $this->validationFactory->make(
                $requireData,
                [
                    'writer_class' => 'required'
                ],
                [
                    'writer_class.required' => '作者标签不能为空'
                ]
            ); 
            if ($validator->fails()) {
                $errorMessage = $validator->errors()->first();
                return Result::error($errorMessage);
            }  
        }

        if(isset($requireData['writer']) && $requireData['type'] != 3){
            $validator = $this->validationFactory->make(
                $requireData,
                [
                    'writer' => 'required'
                ],
                [
                    'writer.required' => '文章作者不能为空'
                ]
            );  
            if ($validator->fails()) {
                $errorMessage = $validator->errors()->first();
                return Result::error($errorMessage);
            }  
        }
        // return Result::success($requireData);
        $result = $this->collectorServiceClient->addRule($requireData);
        if ($result['code'] != ErrorCode::SUCCESS) {
            return Result::error($result['message'],0,[]);
        }
        return Result::success($result['data']);
    }
    
    /**
     * 获取并搜索任务规则
     * @return array
     */
    public function getRule()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'pageSize' => 'required',
                'page' => 'required'
            ],
            [
                'pageSize.required' => '每页显示数量不能为空',
                'page.required' => '第几页不能为空',
            ]
        ); 
        if(isset($requireData['keyWord'])){
            $validator = $this->validationFactory->make(
                $requireData,
                [
                    'keyWord' => 'required'
                ],
                [
                    'keyWord.required' => '搜索词不能为空'
                ]
            ); 
        }      

        if(isset($requireData['web_id'])){
            $validator = $this->validationFactory->make(
                $requireData,
                [
                    'web_id' => 'required'
                ],
                [
                    'web_id.required' => '网站id不能为空'
                ]
            ); 
        }   
             
        if ($validator->fails()) {
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }        
        $result = $this->collectorServiceClient->getRule($requireData);
        if ($result['code'] != ErrorCode::SUCCESS) {
            return Result::error($result['message'],0,[]);
        }
        return Result::success($result['data']);
    }
    /**
     * 获取某个规则任务
     * @return array
     */
    public function getOneRule()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'id' => 'required'
            ],
            [
                'id.required' => '任务规则id不能为空'
            ]
        );        
        if ($validator->fails()) {
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }        
        $result = $this->collectorServiceClient->getOneRule($requireData);
        if ($result['code'] != ErrorCode::SUCCESS) {
            return Result::error($result['message'],0,[]);
        }
        return Result::success($result['data']);
    } 
    /**
     * 修改规则任务
     * @return array
     */
    public function upRule()
    {
        $requireData = $this->request->all();
        // var_dump("&&&&:",$requireData);
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'id' => 'required',
                'name' => 'required',
                'type' => 'required'
            ],
            [
                'name.required' => '任务规则名称不能为空',
                'id.required' => '任务规则id不能为空',
                'type.required' => '网站类型不能为空'
            ]
        );  
        if ($validator->fails()) {
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }
        switch($requireData['type']){
            case 1:
                $validator = $this->validationFactory->make(
                    $requireData,
                    [
                        'first_url' => 'required',
                        'second_start' => 'required',
                        'second_num' => 'required',
                        'second_end' => 'required',
                        'start' => 'required',
                        'con_url' => 'required',
                        'title' => 'required',
                        'content' => 'required',
                    ],
                    [
                        'first_url.required' => '第1页网址不能为空',
                        'second_start.required' => '第2页网址开头不能为空',
                        'second_num.required' => '第2页代码页数不能为空',
                        'second_end.required' => '第2页网址结束字符串不能为空',
                        'end_pagenum.required' => '列表页结束页码不能为空',
                        'start.required' => '开始代码不能为空',
                        'con_url.required' => '详情页前缀地址不能为空',
                        'title.required' => '标题标签类名不能为空',
                        'content.required' => '内容标签类名不能为空',
                    ]
                ); 
                if ($validator->fails()) {
                    $errorMessage = $validator->errors()->first();
                    return Result::error($errorMessage);
                }  
                // var_dump("============1============");  

                break;                
            case 2:
                $validator = $this->validationFactory->make(
                    $requireData,
                    [
                        'first_url' => 'required',
                        'parameter' => 'required',
                        'start' => 'required',
                        'title' => 'required',
                        'content' => 'required',
                    ],
                    [
                        'first_url.required' => '开始采集地址不能为空',
                        'parameter.required' => '接口参数不能为空',
                        'start.required' => '列表标签不能为空',
                        'title.required' => '标题标签不能为空',
                        'content.required' => '内容标签不能为空'
                    ]
                );  
                if ($validator->fails()) {
                    $errorMessage = $validator->errors()->first();
                    return Result::error($errorMessage);
                }  
                // var_dump("============2============");                    
                break;
            case 3:
                $validator = $this->validationFactory->make(
                    $requireData,
                    [
                        'diy_rule' => 'required'
                    ],
                    [
                        'diy_rule.required' => '采集规则不能为空'
                    ]
                ); 
                if ($validator->fails()) {
                    $errorMessage = $validator->errors()->first();
                    return Result::error($errorMessage);
                }  
                // var_dump("============3============");  
                break;
            default:
                return Result::error('请输入正确的网站类型');
                break;
                
        }
        if(isset($requireData['writer_class']) && $requireData['type'] == 2){
            $validator = $this->validationFactory->make(
                $requireData,
                [
                    'writer_class' => 'required'
                ],
                [
                    'writer_class.required' => '作者标签不能为空'
                ]
            ); 
            if ($validator->fails()) {
                $errorMessage = $validator->errors()->first();
                return Result::error($errorMessage);
            }  
        }
        
        if(isset($requireData['writer']) && $requireData['type'] != 3){
            $validator = $this->validationFactory->make(
                $requireData,
                [
                    'writer' => 'required'
                ],
                [
                    'writer.required' => '文章作者不能为空'
                ]
            );  
            if ($validator->fails()) {
                $errorMessage = $validator->errors()->first();
                return Result::error($errorMessage);
            }  
        }
        // var_dump("++++++++++",$requireData);
        $result = $this->collectorServiceClient->upRule($requireData);
        if ($result['code'] != ErrorCode::SUCCESS) {
            return Result::error($result['message'],0,[]);
        }
        return Result::success($result['data']);

    } 
    /**
    * 删除任务规则
    * @return array
    */
    public function delRule()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'rule_id' => 'required'
            ],
            [
                'rule_id.required' => '任务规则id不能为空'
            ]
        ); 
        if ($validator->fails()) {
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }        
        $result = $this->collectorServiceClient->delRule($requireData);
        if ($result['code'] != ErrorCode::SUCCESS) {
            return Result::error($result['message'],0,[]);
        }
        return Result::success($result['data']);
    }

    /**
     * 开始采集
     * @return array
     */
    public function sendCrawler()
    {
        $data = [];
        $data['admin_user_id'] = Context::get("UserId");
        $data['time'] = microtime();
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'id'=> 'required',
            ],
            [
                'id.required' => '规则id不能为空',
            ]
        );
        if ($validator->fails()) {
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }
//        $b  = $this->Iservice->push($data,1);
        $data['id'] = $requireData['id'];
        var_dump("发送数据:",$data);
        $result =  $this->collectorServiceClient->sendCrawler($data);
        return $result['code']==200?Result::success($result['data']):Result::error('采集失败');

    }

    /**
     * 发送请求
     * @param $data
     * @return array
     */

    public function goSendCrawler($data=[])
    {
        var_dump("我要开始采集了!!!");
        $this->collectorServiceClient->sendCrawler($data);
        return Result::success([]);
    }
    /**
     * 获取并搜索资讯
     * @return array
     */
    public function getInfo()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'rule_id' => 'required',
                'pageSize' => 'required',
                'page' => 'required'
            ],
            [
                'rule_id.required' => '规则任务id不能为空',
                'pageSize.required' => '每页显示数量不能为空',
                'page.required' => '第几页不能为空'
            ]
        ); 

        if ($validator->fails()) {
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }
        $result = $this->collectorServiceClient->getInfo($requireData);        
        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
        
    }
    /**
     * 获取某个资讯
     * @return array
     */
    public function getOneInfo()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'art_id' => 'required'
            ],
            [
                'art_id.required' => '资讯id不能为空'
            ]
        ); 
        if ($validator->fails()) {
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }
        $result = $this->collectorServiceClient->getOneInfo($requireData);
        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
    }
    /**
     *修改资讯
     * @return array
     */
    public function upInfo()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(

            $requireData,
            [
                'art_id' => 'required',
                'title' => 'required',
                'keyword' => 'required',
                'content' => 'required',
                'hits' => 'required',
                'is_original' => 'required',
                'islink' => 'required'
            ],
            [
                'art_id.required' => '资讯id不能为空',
                'title.required' => '资讯标题不能为空',
                'keyword.required' => '资讯关键词不能为空',
                'content.required' => '资讯内容不能为空',
                'hits.required' => '浏览量不能为空',
                'is_original.required' => '原创不能为空',
                'islink.required' => '外链不能为空'
            ]
            
        ); 
        if ($validator->fails()) {
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }
        if($requireData['islink']==1){
            $requireData = $this->request->all();
            $validator = $this->validationFactory->make(
                $requireData,
                [
                    'linkurl' => 'required'
                ],
                [
                    'linkurl.required' => '外链地址不能为空'
                ]
            ); 
            if ($validator->fails()) {
                $errorMessage = $validator->errors()->first();
                return Result::error($errorMessage);
            }
        }
        if($requireData['is_original']==0){
            $requireData = $this->request->all();
            $validator = $this->validationFactory->make(
                $requireData,
                [
                    'fromurl' => 'required',
                    'copyfrom' => 'required'
                ],
                [
                    'fromurl.required' => '采集来源地址不能为空',
                    'copyfrom' => '采集来源不能为空'
                ]
            ); 
            if ($validator->fails()) {
                $errorMessage = $validator->errors()->first();
                return Result::error($errorMessage);
            }
        }
        $result = $this->collectorServiceClient->upInfo($requireData);
        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
    }
    /**
     * 删除资讯
     * @return array
     */
    public function delInfo()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'art_id' => 'required'
            ],
            [
                'art_id.required' => '资讯id不能为空'
            ]
        ); 
        if ($validator->fails()) {
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }
        $result = $this->collectorServiceClient->delInfo($requireData);
        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
    }
    /**
     * 关联导航池
     * @return array
     */
    public function addCatid()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'rule_id' => 'required'
            ],
            [
                'rule_id.required' => '任务规则id不能为空'
            ]
        ); 
        if ($validator->fails()) {
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }
        $result = $this->collectorServiceClient->addCatid($requireData);
        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
    }
     /**
     * 开始导入
     * @return array
     */
    public function addArt()
    {
        $requireData = $this->request->all();
        if(!empty($requireData)){
            $validator = $this->validationFactory->make(
                $requireData,
                [
                    'rule_id' => 'required'
                ],
                [
                    'rule_id.required' => '任务规则id不能为空'
                ]
            ); 
            if ($validator->fails()) {
                $errorMessage = $validator->errors()->first();
                return Result::error($errorMessage);
            }
        }
        $data['rule_id'] = $requireData['rule_id'];
        $data['time'] = microtime();
        
        // var_dump("=====111",$data);
        $result  = $this->collectorServiceClient->addArt($data);
        // var_dump("=====222",$result);
        return Result::success($result);
    }

}