<?php
namespace EasyChat\Controller;

use EasyChat\Library\Email\EmailHealthService;
use EasyChat\Model\EmailAccount;

final class EmailIntegration extends Base {
    protected $layouts = 'layout';
    public function __construct($registry) {
        parent::__construct($registry);
        $session = \EasyChat\Library\RequestContext::session();
        if (empty($session['manager_id']) || ($session['manager_role'] ?? '') !== 'admin') { header('Location: index.php?route=auth'); exit; }
    }
    public function index() {
         
         
        header('Location: index.php?route=integration&tab=email');
        exit;
    }
    public function save() {
        $this->guard();
        try {
            $post=\EasyChat\Library\RequestContext::post();$model=new EmailAccount($this->registry);$prepared=$model->prepareConnection($post);$checkId=(string)($post['connection_check_id']??'');
            if(!empty($post['enabled'])&&!$model->checkAllowsActivation($checkId,(string)$prepared['config_fingerprint']))$this->json(409,['success'=>false,'error'=>'Сначала проверьте текущие настройки почты.','code'=>'email_check_required','nonce'=>$this->nonce()]);
            $account = $model->save($post);$model->promoteConnectionCheck($checkId,(int)($account['channel_id']??0));
            $this->json(200, ['success'=>true,'message'=>'Настройки почты сохранены.','enabled'=>($account['status'] ?? '') === 'active','nonce'=>$this->nonce()]);
        } catch (\InvalidArgumentException $e) {
            $this->json(422, ['success'=>false,'error'=>$this->validationMessage($e->getMessage()),'code'=>$e->getMessage(),'nonce'=>$this->nonce()]);
        } catch (\Throwable $e) { $this->json(500, ['success'=>false,'error'=>'Не удалось сохранить подключение.','nonce'=>$this->nonce()]); }
    }
    public function test() {
        $this->guard();
        $session =& \EasyChat\Library\RequestContext::session();$now=time();if((int)($session['easychat_email_test_at']??0)>$now-3)$this->json(429,['success'=>false,'error'=>'Проверка уже выполняется. Подождите несколько секунд.','code'=>'email_test_rate_limited','nonce'=>$this->nonce()]);$session['easychat_email_test_at']=$now;
        try { $model=new EmailAccount($this->registry);$account = $model->prepareConnection(\EasyChat\Library\RequestContext::post()); }
        catch (\InvalidArgumentException $e) {
            $this->json(422, ['success'=>false,'error'=>$this->validationMessage($e->getMessage()),'code'=>$e->getMessage(),'nonce'=>$this->nonce()]);
        }
        $result=(new EmailHealthService($this->registry))->check($account);$checkId=$model->recordConnectionCheck($account,$result);$result['check_id']=$checkId;$result['message']=!empty($result['activation_ready'])?'Почта готова к подключению.':'Исправьте отмеченные настройки и повторите проверку.';$result['nonce']=$this->nonce();$this->json(200,$result);
    }
    private function guard(): void {
        if (\EasyChat\Library\RequestContext::method() !== 'POST') $this->json(405, ['success'=>false,'error'=>'Метод не поддерживается.']);
        $expected = (string)(\EasyChat\Library\RequestContext::session()['easychat_email_nonce'] ?? '');
        $actual = (string)(\EasyChat\Library\RequestContext::post()['nonce'] ?? '');
        if ($expected === '' || $actual === '' || !hash_equals($expected, $actual)) $this->json(403, ['success'=>false,'error'=>'Сессия устарела. Обновите страницу.','nonce'=>$this->nonce()]);
    }
    private function nonce(): string {
        $session =& \EasyChat\Library\RequestContext::session();
        if (empty($session['easychat_email_nonce'])) $session['easychat_email_nonce'] = bin2hex(random_bytes(16));
        return (string)$session['easychat_email_nonce'];
    }
    private function validationMessage(string $code): string {
        $map=['email_address_invalid'=>'Укажите корректный адрес ящика.','email_provider_invalid'=>'Почтовый сервис не распознан. Введите адрес ещё раз.','email_imap_endpoint_invalid'=>'Укажите IMAP-сервер и защищённый порт 993.','email_smtp_endpoint_invalid'=>'Укажите SMTP-сервер и защищённый порт 465 или 587.','email_outbound_transport_invalid'=>'Выберите способ отправки ещё раз.','email_credentials_required'=>'Укажите логин и пароль приложения.','email_smtp_bz_key_required'=>'Укажите API-ключ SMTP.BZ.','email_sender_invalid'=>'Укажите корректный адрес отправителя.'];
        return $map[$code]??'Проверьте настройки почты.';
    }
    private function json(int $status, array $payload): void { http_response_code($status); header('Content-Type: application/json; charset=utf-8'); header('Cache-Control: no-store'); echo json_encode($payload, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES); exit; }
}
