<?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']);

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

        $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(){
        $emails = web_request_emails();
        $udate = app()->request('udate',0,'intval');
        if(!$udate){
            return '';
        }

        // 查询邮箱
        $emails =   db()->all(emailSql::all(dbWhere(['email'=>$emails])));
        if(!$emails){
            return '';
        }

        // 启用协程来处理
        run(function () use ($emails,$udate){
            foreach ($emails as $email){
                // 读取文件夹
                $fids = $this->getFolderIds($email['id']);
                $folders = db()->all(folderSql::all($email['id']));
                // 循环 文件夹
                foreach ($folders as $folder){
                    // 是否在同步请求中
                    if(in_array($folder['id'],$fids)){
                        // 启动 协程
                        go(function () use ($email,$udate,$folder){
                            // 实例一个邮箱对象
                            $mail = new Mail($email['email'],base64_decode($email['password']),$email['imap']);
                            // 登录
                            $mail->login();
                            // 选择 文件夹
                            $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(['ON'=>date('Y-m-d H:i:s',$udate)]);
                            // 进行同步
                            $mail->syncUidEmail(
                                $uids,
                                $email['id'],
                                $folder['origin_folder'],
                                $folder['id'],
                                [],
                                [],
                                db()
                            );

                        });
                    }
                }

            }

        });

    }

}