<?php

namespace Lib\Mail;

use Event\Event;
use Event\syncMail;
use Lib\DbPool;
use Model\bodySql;
use Model\folderSql;
use Model\listsSql;

/**
 * 操作邮件
 * @author:dc
 * @time 2023/2/5 10:10
 * Class MailFun
 * @package Helper\Mail
 */
class Mail {

    /**
     * imap服务器连接实例
     * @var Imap
     */
    public Imap $client;

    /**
     * @var string
     */
    private string $username;

    /**
     * @var string
     */
    private string $password;

    /**
     * @var string
     */
    private string $server;

    /**
     * Mail constructor.
     * @param string $email
     * @param string $password
     * @param string $imap
     */
    public function __construct(string $email,string $password,string $imap)
    {
        $this->username = $email;
        $this->password = $password;
        $this->server = $imap;

        $this->client = new Imap();
    }

    /**
     * 登录imap服务器
     * @param bool $pass_err
     * @return int
     * @author:dc
     * @time 2023/3/14 10:03
     */
    public function login($pass_err=true):int {

        // 处理url
        $host = MailFun::getHostPort($this->server,993,'ssl://');
        try {
            // 是否初始成功
            $this->client->login($host['host'].':'.$host['port'],$this->username,$this->password);
        }catch (\Throwable $e){
            logs($this->username.'===>'.$e->getMessage());
            if($pass_err){
                // 是否是密码错误
                foreach ([
                             'NO [ALERT] Invalid credentials (Failure)',// 登录失败
                             'NO [AUTHENTICATIONFAILED] Invalid credentials (Failure)',// 登录失败
                             'NO [AUTHENTICATIONFAILED] Authentication failed.',// 登录失败 权限
                             'NO LOGIN Login error',// 登录失败
                             'NO LOGIN auth error',// 登录失败
                             'NO ERR.LOGIN.PASSERR',// 登录失败 密码错误
                             'NO Login fail.',// 登录失败
                             'NO LOGIN failed.', // 登录失败
//                    'NO ERR.LOGIN.REQCODE', // 未知错误
                             'NO [ALERT] Application-specific password', // 这个错误是没有提供特定的授权码
                             'NO LOGIN Login error, user name or password error'
                         ] as $em){
                    if(str_contains($e->getMessage(), $em)){
                        db()->update(
                            \Model\emailSql::$table,
                            ['pwd_error'=>1],
                            dbWhere(['email'=>$this->username])
                        );
                    }
                }
                // 一天中超过 3次失败说明密码错误了
//                if(redis()->incr('email_login_error:'.md5($this->username),86400) > 10){
                // 登录失败了 ,
//                    db()->update(\Model\emailSql::$table,['pwd_error'=>1],dbWhere(['email'=>$this->username]));
//                }
                return -1;
            }

            return $e->getCode() == 403 ? 0 : -1;

        }
//        redis()->delete('email_login_error:'.md5($this->username));

        return 1;
    }



    /**
     * 设置为未读
     * @param $uids
     * @return bool
     * @throws \Exception
     * @author:dc
     * @time 2022/10/26 17:11
     */
    public function seen($uids,$folder,$seen):bool{
        // 选择目录
        $status =   $this->client->selectFolder($folder);

        return $this->client->flags($uids,[Imap::FLAGS_SEEN],$seen ? '+' : '-',true);
    }

    /**
     * 删除标记
     * @param $uids
     * @param $folder
     * @param $del
     * @return bool
     * @throws \Exception
     * @author:dc
     * @time 2024/3/9 16:50
     */
    public function deleted($uids,$folder,$del=true):bool{
        // 选择目录
        $status =   $this->client->selectFolder($folder);

        return $this->client->flags($uids,[Imap::FLAGS_DELETED],$del ? '+' : '-',true);
    }

    /**
     * 回复标记
     * @param $uids
     * @param $folder
     * @param $seen
     * @return bool
     * @throws \Exception
     * @author:dc
     * @time 2023/4/6 17:10
     */
    public function answered($uids,$folder,$seen):bool{
        // 选择目录
        $status =   $this->client->selectFolder($folder);

        return $this->client->flags($uids,[Imap::FLAGS_ANSWERED],$seen ? '+' : '-',true);
    }

    /**
     * 回复标记
     * @param $uids
     * @param $folder
     * @param $flagged
     * @return bool
     * @throws \Exception
     * @author:dc
     * @time 2023/4/6 17:10
     */
    public function flagged($uids,$folder,$flagged):bool{
        // 选择目录
        $status =   $this->client->selectFolder($folder);

        return $this->client->flags($uids,[Imap::FLAGS_FLAGGED],$flagged ? '+' : '-',true);
    }


    /**
     * 复制
     * @param $uids
     * @param $folder
     * @param $to_folder
     * @return bool
     * @throws \Exception
     * @author:dc
     * @time 2023/3/22 16:38
     */
    public function copy($uids,$folder,$to_folder){
        // 选择目录
        $status =   $this->client->selectFolder($folder);

        return $this->client->copy($uids,$to_folder);

    }

    /**
     * 移动邮件
     * @param $uids
     * @param $folder
     * @param $to_folder
     * @return bool
     * @throws \Exception
     * @author:dc
     * @time 2023/3/22 18:06
     */
    public function move($uids,$folder,$to_folder){
        // 选择目录
        $status =   $this->client->selectFolder($folder);

        return $this->client->move($uids,$to_folder);

    }

    /**
     * 清空标记为已删除的邮件,不可还原邮件
     * @author:dc
     * @time 2024/3/14 14:11
     */
    public function expunge(){
        return $this->client->expunge();
    }


//    /**
//     * 删除
//     * @param $uids
//     * @param $folder
//     * @return bool
//     * @throws \Exception
//     * @author:dc
//     * @time 2023/3/22 17:52
//     */
//    public function delete($uids,$folder){
//        // 选择目录
//        $status =   $this->client->selectFolder($folder);
//
//        return $this->client->delete($uids);
//    }




}