<?php

class Mailbox {
    private $id             = NULL;
    private $server         = NULL;
    private $hostname       = NULL;
    private $port           = NULL;
    private $protocol       = NULL;
    private $useSsl         = NULL;
    private $noValidCert    = NULL;
    private $username       = NULL;
    private $password       = NULL;
    private $mailbox        = NULL;
    private $folders        = NULL;
    private $connected      = false;

    public function __construct($id, $hostname, $port, $protocol, $useSsl, $noValidCert, $username, $password, $connect) {
        $this->id           = $id;
        $this->hostname     = $hostname;
        $this->port         = $port;
        $this->protocol     = $protocol;
        $this->useSsl       = $useSsl;
        $this->noValidCert  = $noValidCert;
        $this->username     = $username;
        $this->password     = $password;
        $this->server       = '{' . $this->hostname . ':' . $this->port . '/' . $this->protocol . $this->useSsl . $this->noValidCert . '}';

        if($connect) {
            $this->mailbox = imap_open($this->server . 'INBOX', $this->username, $this->password); //  or error('Failed to connect to IMAP: ' . $this->username . '@' . $this->hostname)
            imap_errors();
            imap_alerts();
            if($this->mailbox == false) {
                $this->connected = false;
            } else {
                $this->connected = true;
            }
        }
    }

    public function changeFolder($folder) {
        imap_reopen($this->mailbox, $this->server . $folder);
    }

    public function listFolders() {
        $newFolders = array();
        $folders = imap_list($this->mailbox, $this->server, "*");

        foreach($folders as $folder) {
            $newFolders[] = preg_replace('/(\{(.*)\})(.*)/', '${3}', $folder);
        }

        $this->folders = $newFolders;
    }

    public function getId() {
        return $this->id;
    }

    public function getFolders() {
        return $this->folders;
    }

    public function getServer() {
        return $this->server;
    }

    public function getMailbox() {
        return $this->mailbox;
    }

    public function getHostname() {
        return $this->hostname;
    }

    public function getPort() {
        return $this->port;
    }

    public function getProtocol() {
        return $this->protocol;
    }

    public function getUseSsl() {
        return $this->useSsl;
    }

    public function getNoValidCert() {
        return $this->noValidCert;
    }

    public function getUsername() {
        return $this->username;
    }

    public function getConnected() {
        return $this->connected;
    }

    public function getStatus() {
        return imap_status($this->mailbox, $this->server, SA_ALL);
    }

    public function setConnected($connected) {
        $this->connected = $connected;
    }

    /**
     * Get all Mailboxes
     *
     *
     * @param bool $connect  Whether to connect or just to store data
     *
     * @return Array(Mailbox)  All Mailboxes
     *
     */

    public static function getAllMailboxes($connect = true) {
        global $db;

        $return = array();
        $mailboxes = $db->selectQuery("SELECT * FROM `mailboxes`;");

        foreach($mailboxes as $mailbox) {
            $useSsl = '';
            $noValidCert = '';

            if($mailbox->use_ssl) {
                $useSsl = '/ssl';
            }

            if(!$mailbox->valid_ssl) {
                $noValidCert = '/novalidate-cert';
            }
            $return[] = new Mailbox($mailbox->id, $mailbox->server, $mailbox->port, $mailbox->protocol, $useSsl, $noValidCert, $mailbox->username, $mailbox->password, $connect);
        }

        return $return;
    }

    /**
     * Get Mailbox by ID
     *
     *
     * @param int $userId  ID of Mailbox
     * @param bool $connect Whether to connect or just to store data. Default: false
     *
     * @return Mailbox  Selected Mailboxes
     *
     */

    public static function getMailboxById($mailboxId, $connect = false) {
        global $db;

        $return = array();
        $mailboxes = $db->selectQuery("SELECT * FROM `mailboxes` WHERE `id` = " . $mailboxId . ";");

        foreach($mailboxes as $mailbox) {
            $useSsl = '';
            $noValidCert = '';

            if($mailbox->use_ssl) {
                $useSsl = '/ssl';
            }

            if(!$mailbox->valid_ssl) {
                $noValidCert = '/novalidate-cert';
            }
            $return[] = new Mailbox($mailbox->id, $mailbox->server, $mailbox->port, $mailbox->protocol, $useSsl, $noValidCert, $mailbox->username, $mailbox->password, $connect);
        }

        return $return[0];
    }

    /**
     * Get Mailboxes by User ID
     *
     *
     * @param int $userId  ID of user
     *
     * @return Array(Mailbox)  Array with selected Mailboxes
     *
     */

    public static function getMailboxesByUserId($userId) {
        global $db;

        $return = array();
        $mailboxes = $db->selectQuery("SELECT * FROM `mailboxes` WHERE `user_id` = " . $userId . ";");

        foreach($mailboxes as $mailbox) {
            $useSsl = '';
            $noValidCert = '';

            if($mailbox->use_ssl) {
                $useSsl = '/ssl';
            }

            if(!$mailbox->valid_ssl) {
                $noValidCert = '/novalidate-cert';
            }
            $return[] = new Mailbox($mailbox->id, $mailbox->server, $mailbox->port, $mailbox->protocol, $useSsl, $noValidCert, $mailbox->username, $mailbox->password, false);
        }

        return $return;
    }

    /**
     * Get name of Mailbox by MailAccountID
     *
     *
     * @param int $mId  MailAccount ID
     *
     * @return string  Name of Mailbox
     *
     */

    public static function getMailboxNameFromMailaccountId($mId) {
        global $db;

        $mailbox = $db->selectStringQuery("SELECT `username` FROM `mailboxes` WHERE id=" . $mId);
        return $mailbox;
    }

    /**
     * Description
     *
     * @param type $name  description
     *
     * @return type  the integer of the set mode used. FALSE if foo
     *
     */

     public static function getMailboxByUsername($mailboxUsername) {
         global $db;

         $mailbox = $db->selectQuery("SELECT * FROM `mailboxes` WHERE `username` = '" . $mailboxUsername . "';");

         $useSsl = '';
         $noValidCert = '';

         if($mailbox[0]->use_ssl) {
             $useSsl = '/ssl';
         }

         if(!$mailbox[0]->valid_ssl) {
             $noValidCert = '/novalidate-cert';
         }

         return new Mailbox($mailbox[0]->id, $mailbox[0]->server, $mailbox[0]->port, $mailbox[0]->protocol, $useSsl, $noValidCert, $mailbox[0]->username, $mailbox[0]->password, false);

     }


}
