<?php

namespace Controller;

use Lib\Mail\Mail;
use Lib\Mail\MailFun;
use Lib\UploadFile;
use Lib\Verify;
use Model\bodySql;
use Model\emailSql;
use Model\folderSql;
use Model\listsSql;
use Model\sendJobsSql;
use Service\SyncMail;


/**
 * @author:dc
 * @time 2023/2/13 11:28
 * Class Home
 * @package Controller
 */
class HomeEs extends Base {


    /**
     * 邮件列表
     * @author:dc
     * @time 2023/2/17 14:12
     */
    public function lists(){

        // 分页 页数
        $page   =   app()->request('page',1,'intval');
        $page   =   $page ? $page : 1;

        $limit   =   app()->request('limit',20,'intval');
        $limit   =   $limit ? $limit : 1;

        // 指定id
        $ids = app()->request('mail_id');
        $ids = is_array($ids) ? $ids : [$ids];
        foreach ($ids as $i=>$d){
            if(!is_numeric($d)){
                unset($ids[$i]);
            }
        }

        // 附件
        $attachment =   app()->request('attachment',0,'bool_Val');
        // 已读/未读
        $seen =   app()->request('seen',-1,'intval');
        // 软删
        $deleted =   app()->request('deleted',0,'intval');


        $query = [
            'query'=>[
                'bool'=>[
                    'must'=>[
                        [
                            'terms'=>['email_id'=>$this->getEmails('id')]
                        ]
                    ]
                ]
            ]
        ];

        $folder_id = [];
        if (app()->requestArr('folder_id')){
            $folder_id = app()->requestArr('folder_id');
        }else{
            // 目录
            $folder = app()->request('folder','收件箱','folderAlias');
            if(!($folder === true || $folder ==='true')){
                $folderList = db()->all(folderSql::all($this->getEmails('id')));

                // 文件夹id
                if($folderList){
                    foreach ($folderList as $item){
                        if(
                            // 数组文件夹
                            (is_array($folder) && in_array($item['folder'],$folder))
                            || $item['folder'] == $folder
                        ){
                            $folder_id[] = $item['id'];
                        }
                    }
                }
            }

        }

        if($folder_id){
            $query['query']['bool']['must'][] = ['terms'=>[
                'folder_id'=>$folder_id
            ]];
        }


        if($ids) {
            $query['query']['bool']['must'][] = ['terms'=>[
                'uuid'=>$folder_id
            ]];
        }

        if(paramHas('attachment')){ //附件
            $query['query']['bool']['must'][] = ['term'=>[
                'is_file'=>$attachment ? 1 : 0
            ]];
        }
        // 软删
        $query['query']['bool']['must'][] = ['term'=>[
            'deleted'=>$deleted
        ]];

        // 已读/未读
        if(paramHas('seen')){
            if(in_array($seen,[0,1])){
                $query['query']['bool']['must'][] = ['term'=>[
                    'seen'=>$seen
                ]];
            }
        }

        $where['_'] = [];
        // 搜索关键字
        $keyword = app()->request('keyword','',['htmlspecialchars','addslashes']);
        if($keyword){
            $query['query']['bool']['must'][] = [
                'query_string'  =>  [
                    'query'=>'"'.addcslashes($keyword,'"').'"',
                    "default_field"=> "subject"
                ]
            ];
        }

        // 那个发的
        $address = app()->request('address');
        if($address){
            if(is_array($address)){
                // 发贱人
                if(Verify::sEmail($address['from']??'')){
                    $query['query']['bool']['must'][] = ['match_phrase'=>['from.email'=>$address['from']]];
                }
                // 收件人
                if(Verify::sEmail($address['to']??'')){
                    $query['query']['bool']['must'][] = [
                        'match_phrase'  =>  [
                            'to'=> $address['to'],
                        ]
                    ];
                }

            }else if($address){// 收件人/发件人
                $query['query']['bool']['must'][] = [
                    'bool'  =>[
                        'should'=>[
                            ['bool'=>['must'=>[['match_phrase'=>['from.email'=>$address]]]]],
                            ['bool'=>['must'=>[['match_phrase'=>['to'=>$address]]]]],
                        ]
                    ]
                ];
            }
        }
        // from 搜索收件人
        if(app()->requestHas('from')){
            // 如果是发件箱
            if($folder == '发件箱'){
                $tos = app()->request('from');
                if(!$tos){
                    // 不让查询数据
                    $query['query']['bool']['must'][] = ['term'=>['uuid'=>0]];
                }else {
                    $tos = array_map(function ($v){
                        return '"'.addcslashes($v,'"').'"';
                    },is_array($tos) ? $tos : [$tos]);

                    $query['query']['bool']['must'][] = [
                        'query_string'  =>  [
                            'query'=> implode(' OR ',$tos),
                            "default_field"=> "to"
                        ]
                    ];
                }
            }else{
                $from = app()->request('from');
                if(!$from){
                    // 不让查询数据
                    $query['query']['bool']['must'][] = ['term'=>['uuid'=>0]];
                }else{
                    $from = is_array($from)?$from:[$from];
                    $query['query']['bool']['must'][] = ['query_string'=>[
                        'query'=>'from.email:('.implode(' OR ',array_map(function($e){
                                return '"'.$e.'"';
                            },$from)).')']
                    ];
                }
            }


        }


        // 回复
        if (paramHas('answered')){
            $query['query']['bool']['must'][] = ['term'=>['answered'=>app()->request('answered',0,'bool_Val')?1:0]];
        }

        // 这个主要是来筛选 是否是自己发送的
        $fromto = app()->request('formorto');
        if($fromto=='from'){
            $query['query']['bool']['must'][] = [
                'query_string'  =>  [
                    'query'=> implode(' OR ',$this->getEmails('email')),
                    "default_field"=> "from"
                ]
            ];
        }elseif ($fromto=='to'){
            $query['query']['bool']['must'][] = [
                'bool'=>[
                    'must_not'=>[
                        [
                            'query_string'  =>  [
                                'query'=> implode(' OR ',$this->getEmails('email')),
                                "default_field"=> "from"
                            ]
                        ]
                    ]
                ]
            ];
        }

        /**
         * 不查询哪些发件人的邮件
         */
        $form_not_in = app()->request('from_not_in');
        if($form_not_in){
            $form_not_in = is_array($form_not_in) ? $form_not_in : [$form_not_in];
            $form_not_in = array_filter($form_not_in,function ($v){
                if(is_string($v) && Verify::sEmail($v)){
                    return true;
                }
                return false;
            });
        }
        if($form_not_in){
            $query['query']['bool']['must'][] = [
                'bool'=>[
                    'must_not'=>[
                        [
                            'query_string'  =>  [
                                'query'=> implode(' OR ',array_unique($form_not_in)),
                                "default_field"=> "from"
                            ]
                        ]
                    ]
                ]
            ];
        }

        $lists = es()->search($query, ($page-1)*$limit, $limit,['udate'=>'desc']);
        $total = $lists['hits']['total']['value']??0;
        $lists = $lists['hits']['hits']??[];

        // map
        $lists = array_map(function ($v){
            $v = $v['_source'];
            $v['id'] = $v['uuid'];

            $v['from_name'] = $v['from']['name']??'';
            $v['from'] = $v['from']['email']??'';

            $v['uuid'] = get_email_uuid($v['subject'],$v['udate'],$v['from'],$v['to'],$v['size']);
            if(!empty($v['description'])){
                $v['description'] = @html_entity_decode($v['description'], ENT_COMPAT, 'UTF-8');
            }
            $v['to_name'] = @json_decode($v['to_name'],true);
            $v['to_name'] = $v['to_name']?:[];
            if($v['to_name']){
                if(!empty($v['to_name'][0]['email'])){
                    $v['to'] = $v['to_name'][0]['email'];
                }
                $v['to_name'] = MailFun::mb_coding($v['to_name'][0]['name']??'');
            }
            if(is_array($v['to_name'])){
                $v['to_name'] = '';
            }
            // 邮件箱
            $v['folder_name'] = db()->cache(86400)->value(folderSql::first($v['folder_id'],'folder'));
            return $v;
        },$lists);

        app()->_json(listsPage($lists,$total,$page,$limit));

    }

    /**
     * 统计
     * @throws \Lib\Err
     * @author:dc
     * @time 2024/10/14 16:20
     */
    public function count()
    {

        $body = [];
        $body['query'] = [
            'bool'=>[
                'must'=>[
                    ['term'=>['deleted'=>0]]
                ]
            ]
        ];


        $start_time = app()->request('start_time',0,'intval');
        $end_time = app()->request('end_time',0,'intval');


        if($start_time){
            $body['query']['bool']['must'][] = [
                'range' => [
                    'udate' => [
                        'gte' => $start_time, // 大于等于开始日期
                    ]
                ]
            ];
        }
        if($end_time){
            $body['query']['bool']['must'][] = [
                'range' => [
                    'udate' => [
                        'lte' => $end_time,
                    ]
                ]
            ];
        }

        // 目录
        $folderList = db()->all(folderSql::all($this->getEmails('id')));


        $count = function ($body,$folder,$seen=null) use ($folderList){
            // 文件夹id
            $fids = [];
            foreach ($folderList as $item) {
                if ($item['folder'] == $folder) {
                    $fids[] = $item['id'];
                }
            }
            if($fids){
                $body['query']['bool']['must'][] = [
                    'terms' => [
                        'folder_id' => $fids
                    ]
                ];
            }else{
                $body['query']['bool']['must'][] = [
                    'term' => [
                        'folder_id' => -1
                    ]
                ];
            }
            if($seen!==null){
                // 未读
                $body['query']['bool']['must'][] = [
                    'term' => [
                        'seen' => $seen
                    ]
                ];
            }


            return es()->count($body);

        };



        // 总数
        $inbox  = $count($body,'收件箱');

        if(app()->request('show')=='inbox'){
            app()->_json(['inbox'=>$inbox]);
        }


        $unseen  = $count($body,'收件箱',0);

        //发件箱
        $send  = $count($body,'发件箱',0);

        app()->_json(['inbox'=>$inbox,'unseen'=>$unseen,'send'=>$send]);
    }



}