<?php

namespace Controller\v2;

use Controller\Base;
use Lib\Mail\Mail;
use Model\folderSql;
use Model\listsSql;


/**
 * @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 = app()->request('folder','收件箱');
            $folder_ids = db()->value(
                sprintf(
                    "select `id` from `%s` where `email_id` = %d and `folder` = '%s'",
                    folderSql::$table
                    ,$email_id,
                    addslashes($folder)
                )
            );

            $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 'no udate';
        }
        // 读取文件夹
        $fids = $this->getFolderIds($email['id']);
        $folders = db()->all(folderSql::all($email['id']));
        // 启动 协程
        // 实例一个邮箱对象
        $mail = new Mail($email['email'],base64_decode($email['password']),$email['imap']);
        // 登录
        if($mail->login()!=1){
            return '登录失败';
        }

        if(!$folders){
            $mail->syncFolder($email['id']);
            return 'sync folder';
        }

        // 循环 文件夹
        foreach ($folders as $folder){
            // 是否在同步请求中
            if(in_array($folder['id'],$fids)){
                // 选择 文件夹
                $mail->client->selectFolder($folder['origin_folder']);
                // 最后的时间
                $maxudate = db()->value(
                    sprintf(
                        "select `udate` from `%s` where `email_id` = %d and `folder_id` = %d order by `udate` desc 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){

                    $us = [];
                    foreach ($uids as $k=>$uid){
                        if(!isset($us[intval($k/100)])) $us[intval($k/100)] = [];
                        $us[intval($k/100)][] = trim($uid);
                    }

                    foreach ($us as $u){
                        // 已有的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(',',$u)
                            )
                        );
                        $useuids = $useuids ? array_column($useuids,'uid') : [];
                        if($useuids){
                            // 删除多余的
                            foreach ($u as $k=>$ui){
                                if(in_array($ui,$useuids)){
                                    unset($u[$k]);
                                }
                            }
                        }


                        if($u){
                            // 进行同步
                            $mail->syncUidEmail(
                                array_values($u),
                                $email['id'],
                                $folder['origin_folder'],
                                $folder['id'],
                                [],
                                [],
                                db()
                            );
                        }


                    }



                }

            }
        }

        return 'ok';
    }

}