<?php

namespace Controller\v2;

use Controller\Base;
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 function Co\run;


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


    private function getFolderIds($email_id){
        $folder_ids   =   app()->request('folder_ids',[],['intval','abs']);

        if(is_array($folder_ids)){
            foreach ($folder_ids as $k=>$folder_id){
                if(!$folder_id){
                    unset($folder_ids[$k]);
                }
            }

            if($folder_ids){
                $folder_ids = array_values($folder_ids);
            }
        }

        // 默认查询 inbox
        if(!is_array($folder_ids) || !$folder_ids){
            $folder_ids = db()->value(
                sprintf(
                    "select `id` from `%s` where `email_id` = %d and `origin_folder` = 'INBOX'",
                    folderSql::$table
                    ,$email_id
                )
            );

            $folder_ids = [$folder_ids];
        }

        return $folder_ids;
    }


    /**
     * 邮件列表 针对aicc应用那边
     * @author:dc
     * @time 2023/2/17 14:12
     */
    public function lists(){

        $limit   =   app()->request('limit',20,['intval','abs']);

        $last_id   =   app()->request('last_id',0,['intval','abs']);

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

        $where = ['email_id'    =>  $this->getEmail('id')];

        //目录
        $where['folder_id'] = $this->getFolderIds($where['email_id']);


        $sql = "`id` > ".$last_id;
        if($udate){
            $sql .= " and `udate` > ".$udate;
        }

        $lists = db()->all(
            sprintf(
                "select `id`,`subject`,`from`,`from_name`,`seen`,`udate`,`email_id` from `%s` where %s and %s order by `id` asc limit %d"
                ,listsSql::$table
                ,$sql
                ,dbWhere($where)
                ,$limit
            )
        );

        app()->_json(['data'=>$lists?:[]]);

    }


    /**
     * v2 版本
     * 同步规定 时间 之后的邮件
     * @return string
     * @throws \Lib\Err
     * @author:dc
     * @time 2023/8/2 16:19
     */
    public function sync(){
        ignore_user_abort(true);
        set_time_limit(0);

        $email = $this->getEmail();
        $udate = app()->request('udate',0,'intval');
        if(!$udate){
            return '';
        }
        // 读取文件夹
        $fids = $this->getFolderIds($email['id']);
        $folders = db()->all(folderSql::all($email['id']));
        // 启动 协程
        // 实例一个邮箱对象
        $mail = new Mail($email['email'],base64_decode($email['password']),$email['imap']);
        // 登录
        $mail->login();

        // 循环 文件夹
        foreach ($folders as $folder){
            // 是否在同步请求中
            if(in_array($folder['id'],$fids)){
                // 选择 文件夹
                $mail->client->selectFolder($folder['origin_folder']);
                // 最后的时间
                $maxudate = db()->value(
                    sprintf(
                        "select max(`udate`) from `%s` where `email_id` = %d and `folder_id` = %d limit 1",
                        listsSql::$table,
                        $email['id'],
                        $folder['id']
                    )
                );
                $udate = $udate > $maxudate ? $udate : $maxudate;

                // 通过时间来搜索uid
                $uids = $mail->client->search(['SINCE'=>date('d-M-Y',$udate)],true);
                if ($uids){
                    // 已有的uid
                    $useuids = db()->all(
                        sprintf(
                            "select `uid` from `%s` where `email_id` = %d and `folder_id` = %d and `uid` in (%s)",
                            listsSql::$table,
                            $email['id'],
                            $folder['id'],
                            implode(',',$uids)
                        )
                    );
                    $useuids = $useuids ? array_column($useuids,'uid') : [];
                    if($useuids){
                        // 删除多余的
                        foreach ($uids as $k=>$uid){
                            if(in_array($uid,$useuids)){
                                unset($uids[$k]);
                            }
                        }
                    }
                    if($uids){
                        // 进行同步
                        $mail->syncUidEmail(
                            $uids,
                            $email['id'],
                            $folder['origin_folder'],
                            $folder['id'],
                            [],
                            [],
                            db()
                        );
                    }

                }

            }
        }


    }

}