<?php
/**
* 2013-2018 Ovidiu Cimpean
*
* Ovidiu Cimpean - Newsletter Pro © All rights reserved.
*
* DISCLAIMER
*
* Do not edit, modify or copy this file.
* If you wish to customize it, contact us at addons4prestashop@gmail.com.
*
* @author    Ovidiu Cimpean <addons4prestashop@gmail.com>
* @copyright 2013-2018 Ovidiu Cimpean
* @license   Do not edit, modify or copy this file
* @version   Release: 4
*/

class NewsletterProPrivacyData
{
    public static $anonymous_email = 'anonymous@anonymous.com';

    public static $log_files = array(
        'errors.log',
        'info.log',
        'send.log',
        'task.log',
    );

    public function __construct()
    {
       
    }

    public function search($email)
    {
        $results = array(
            'info' => array(
                'db_prefix' => _DB_PREFIX_,
                'is_email'  => Validate::isEmail($email),
            ),
            'tables' => NewsletterProPrivacyDataResponse::collectionToArray($this->serachTables($email)),
            'logs'   => NewsletterProPrivacyDataResponse::collectionToArray($this->searchLogs($email)),
            'csv'    => NewsletterProPrivacyDataResponse::collectionToArray($this->searchCSV($email)),
        );

        return $results;
    }

    public function clear($email)
    {
        $results = array(
            'info' => array(
                'db_prefix' => _DB_PREFIX_,
                'is_email' => Validate::isEmail($email),
            ),
            'tables' => NewsletterProPrivacyDataResponse::collectionToArray($this->clearTables($email)),
            'logs' => NewsletterProPrivacyDataResponse::collectionToArray($this->clearLogs($email)),
            'csv' => NewsletterProPrivacyDataResponse::collectionToArray($this->clearCSV($email)),
        );

        return $results;
    }

    public function export($email)
    {
        $responses = array(
            NewsletterProEmail::exportPrivacy($email),
            NewsletterProEmailExclusion::exportPrivacy($email),
            NewsletterProForward::exportPrivacy($email),
            NewsletterProFwdUnsubscribed::exportPrivacy($email),
            NewsletterProSend::exportPrivacy($email),
            NewsletterProSendStep::exportPrivacy($email),
            NewsletterProSubscribers::exportPrivacy($email),
            NewsletterProSubscribersTemp::exportPrivacy($email),
            NewsletterProSubscriptionConsent::exportPrivacy($email),
            NewsletterProTask::exportPrivacy($email),
            NewsletterProTaskStep::exportPrivacy($email),
            NewsletterProUnsubscribed::exportPrivacy($email),
            NewsletterProCustomerCategory::exportPrivacy($email),
            NewsletterProCustomerListOfInterests::exportPrivacy($email),
            $this->emailsubscriptionExportPrivacy($email),
            $this->newsletterExportPrivacy($email),
            $this->customerExportPrivacy($email),
        );

        $export = array();
        $errors = array();

        foreach ($responses as $response) {
            $data = $response->toArray();
            if (!empty($data['export'])) {
                foreach ($data['export'] as $value) {
                    $export[] = $value;
                }
            }

            if ($response->hasErrors()) {
                $response->appendErrors($errors);
            }
        }


        return array(
            'data' => $export,
            'errors' => $errors,
        );
    }

    public function hookActionDelete($email)
    {
        $response = array();

        foreach ($this->clearTables($email) as $response_obj) {
            if ($response_obj->hasErrors()) {
                $response_obj->appendErrors($response);
            }
        }

        foreach ($this->clearLogs($email) as $response_obj) {
            if ($response_obj->hasErrors()) {
                $response_obj->appendErrors($response);
            }
        }

        foreach ($this->clearCSV($email) as $response_obj) {
            if ($response_obj->hasErrors()) {
                $response_obj->appendErrors($response);
            }
        }

        if (empty($response)) {
            return true;
        }

        return $response;
    }

    private function clearTables($email)
    {
        return array(
            NewsletterProEmail::clearPrivacy($email),
            NewsletterProEmailExclusion::clearPrivacy($email),
            NewsletterProForward::clearPrivacy($email),
            NewsletterProFwdUnsubscribed::clearPrivacy($email),
            NewsletterProSend::clearPrivacy($email),
            NewsletterProSendStep::clearPrivacy($email),
            NewsletterProSubscribers::clearPrivacy($email),
            NewsletterProSubscribersTemp::clearPrivacy($email),
            NewsletterProSubscriptionConsent::clearPrivacy($email),
            NewsletterProTask::clearPrivacy($email),
            NewsletterProTaskStep::clearPrivacy($email),
            NewsletterProUnsubscribed::clearPrivacy($email),
            NewsletterProCustomerCategory::clearPrivacy($email),
            NewsletterProCustomerListOfInterests::clearPrivacy($email),
            $this->emailsubscriptionClearPrivacy($email),
            $this->newsletterClearPrivacy($email),
            $this->customerClearPrivacy($email),
        );
    }

    private function clearLogs($email)
    {
        $responses = array();
        $logs_dir = _NEWSLETTER_PRO_DIR_ . '/logs/';

        foreach (self::$log_files as $name) {
            $filename = $logs_dir.$name;

            if (file_exists($filename) && is_readable($filename)) {
                $content = Tools::file_get_contents($filename);
                $response = new NewsletterProPrivacyDataResponse(NewsletterProPrivacyDataResponse::TYPE_CLEAR, $name, $email);

                if (preg_match_all('/' . preg_quote($email) . '[^\w]/', $content, $match)) {
                    if (count($match) > 0) {
                        $new_content = preg_replace('/' . preg_quote($email) . '([^\w])/', self::$anonymous_email.'${1}', $content);
                        if (file_put_contents($filename, $new_content) !== false) {
                            $response->addToCount(count($match[0]));
                        } else {
                            $response->addError(sprintf(NewsletterPro::getInstance()->l('Unable to write the file [%s].'), $filename));
                        }
                    }
                }

                $responses[] = $response;
            }
        }

        return $responses;
    }

    private function clearCSV($email)
    {
        $responses = array();

        $csv_filename = _NEWSLETTER_PRO_DIR_.'/csv/import/';

        $files = NewsletterProTools::getDirectoryIterator($csv_filename, '/.csv$/i');

        foreach ($files as $file) {
            $name = $file->getFilename();
            $filename = $file->getPathname();

            if (!$file->isDot() && $name !== 'sample.csv') {
                $response = new NewsletterProPrivacyDataResponse(NewsletterProPrivacyDataResponse::TYPE_CLEAR, $name, $email);
    
                if ($file->isReadable()) {
                    $content = Tools::file_get_contents($filename);
                    
                    if (preg_match_all('/' . preg_quote($email) . '[^\w]/', $content, $match)) {
                        
                        if (count($match) > 0) {
                            $new_content = preg_replace('/.*' . preg_quote($email) . '([^\w]).*(\s+)?/', '', $content);
                            if (file_put_contents($filename, $new_content) !== false) {
                                $response->addToCount(count($match[0]));
                            } else {
                                $response->addError(sprintf(NewsletterPro::getInstance()->l('Unable to write the file [%s].'), $filename));
                            }
                        }
                    }
                }

                $responses[] = $response;
            }
        }

       return $responses;
    }

    private function serachTables($email)
    {
        return array(
            NewsletterProEmail::privacySerach($email),
            NewsletterProEmailExclusion::privacySerach($email),
            NewsletterProForward::privacySerach($email),
            NewsletterProFwdUnsubscribed::privacySerach($email),
            NewsletterProSend::privacySerach($email),
            NewsletterProSendStep::privacySerach($email),
            NewsletterProSubscribers::privacySerach($email),
            NewsletterProSubscribersTemp::privacySerach($email),
            NewsletterProSubscriptionConsent::privacySerach($email),
            NewsletterProTask::privacySerach($email),
            NewsletterProTaskStep::privacySerach($email),
            NewsletterProUnsubscribed::privacySerach($email),
            NewsletterProCustomerCategory::privacySerach($email),
            NewsletterProCustomerListOfInterests::privacySerach($email),
            $this->emailsubscriptionPrivacySerach($email),
            $this->newsletterPrivacySerach($email),
            $this->customerPrivacySerach($email)
        );
    }

    private function searchLogs($email)
    {
        $responses = array();
        $logs_dir = _NEWSLETTER_PRO_DIR_.'/logs/';

        foreach (self::$log_files as $name) {
            $filename = $logs_dir.$name;

            if (file_exists($filename) && is_readable($filename)) {
                $content = Tools::file_get_contents($filename);
                $response = new NewsletterProPrivacyDataResponse(NewsletterProPrivacyDataResponse::TYPE_SEARCH, $name, $email);

                if (preg_match_all('/' . preg_quote($email) . '[^\w]/', $content, $match)) {
                    if (count($match) > 0) {
                        $response->addToCount(count($match[0]));
                    }
                }

                $responses[] = $response;
            }
        }

        return $responses;
    }

    private function searchCSV($email)
    {
        $responses = array();

        $csv_filename = _NEWSLETTER_PRO_DIR_.'/csv/import/';

        $files = NewsletterProTools::getDirectoryIterator($csv_filename, '/.csv$/i');

        foreach ($files as $file) {
            $name = $file->getFilename();
            $filename = $file->getPathname();

            if (!$file->isDot() && $name !== 'sample.csv') {
                $response = new NewsletterProPrivacyDataResponse(NewsletterProPrivacyDataResponse::TYPE_SEARCH, $name, $email);
    
                if ($file->isReadable()) {
                    $content = Tools::file_get_contents($file->getPathname());
                    
                    if (preg_match_all('/' . preg_quote($email) . '[^\w]/', $content, $match)) {
                        if (count($match) > 0) {
                            $response->addToCount(count($match[0]));
                        }
                    }
                }

                $responses[] = $response;
            }
        }

        return $responses;
    }

    private function emailsubscriptionPrivacySerach($email)
    {
        $response = new NewsletterProPrivacyDataResponse(NewsletterProPrivacyDataResponse::TYPE_SEARCH, 'emailsubscription', $email);

        if (!NewsletterProTools::tableExists('emailsubscription')) {
            return $response;
        }

        try {
            $count = (int)Db::getInstance()->getValue('
                SELECT COUNT(*) FROM `' . _DB_PREFIX_ . 'emailsubscription` WHERE `email` = "' . pSQL($email) . '"
            ');
            $response->addToCount($count);
        } catch (Exception $e) {
            $response->addException($e);
        }
        
        return $response;
    }

    private function emailsubscriptionExportPrivacy($email)
    {
        $response = new NewsletterProPrivacyDataResponse(NewsletterProPrivacyDataResponse::TYPE_EXPORT, 'emailsubscription', $email);

        if (!NewsletterProTools::tableExists('emailsubscription')) {
            return $response;
        }

        try {
            $results = Db::getInstance()->executeS('
                SELECT * FROM `' . _DB_PREFIX_ . 'emailsubscription` WHERE `email` = "' . pSQL($email) . '"
            ');

            if (count($results) > 0) {
                $data = null;
                foreach ($results as $row) {
                    if ((bool)$row['active'] == true) {
                        $data = $row;
                        break;
                    }
                }

                if (!isset($data)) {
                    $data = $row;
                }

                $response->addToExport(array(
                    NewsletterPro::getInstance()->l('Subscription list') => '',
                    NewsletterPro::getInstance()->l('Subscribed') => ((int)$data['active'] ? NewsletterPro::getInstance()->l('Yes') : NewsletterPro::getInstance()->l('No')),
                    NewsletterPro::getInstance()->l('Email') => (string)$data['email'],
                    NewsletterPro::getInstance()->l('IP address') => (string)$data['ip_registration_newsletter'],
                    NewsletterPro::getInstance()->l('Date add') => (string)$data['newsletter_date_add'],
                ));
            }

        } catch (Exception $e) {
            $response->addException($e);
        }

        return $response;
    }

    private function newsletterPrivacySerach($email)
    {
        $response = new NewsletterProPrivacyDataResponse(NewsletterProPrivacyDataResponse::TYPE_SEARCH, 'newsletter', $email);

        if (!NewsletterProTools::tableExists('newsletter')) {
            return $response;
        }

        try {
            $count = (int)Db::getInstance()->getValue('
                SELECT COUNT(*) FROM `' . _DB_PREFIX_ . 'newsletter` WHERE `email` = "' . pSQL($email) . '"
            ');
            $response->addToCount($count);
        } catch (Exception $e) {
            $response->addException($e);
        }
        
        return $response;
    }

    private function newsletterExportPrivacy($email)
    {
        $response = new NewsletterProPrivacyDataResponse(NewsletterProPrivacyDataResponse::TYPE_EXPORT, 'newsletter', $email);

        if (!NewsletterProTools::tableExists('newsletter')) {
            return $response;
        }

        try {
            $results = Db::getInstance()->executeS('
                SELECT * FROM `' . _DB_PREFIX_ . 'newsletter` WHERE `email` = "' . pSQL($email) . '"
            ');

            if (count($results) > 0) {
                $data = null;
                foreach ($results as $row) {
                    if ((bool)$row['active'] == true) {
                        $data = $row;
                        break;
                    }
                }

                if (!isset($data)) {
                    $data = $row;
                }

                $response->addToExport(array(
                    NewsletterPro::getInstance()->l('Newsletter list') => '',
                    NewsletterPro::getInstance()->l('Subscribed') => ((int)$data['active'] ? NewsletterPro::getInstance()->l('Yes') : NewsletterPro::getInstance()->l('No')),
                    NewsletterPro::getInstance()->l('Email') => (string)$data['email'],
                    NewsletterPro::getInstance()->l('IP address') => (string)$data['ip_registration_newsletter'],
                    NewsletterPro::getInstance()->l('Date add') => (string)$data['newsletter_date_add'],
                ));
            }

        } catch (Exception $e) {
            $response->addException($e);
        }


        return $response;
    }

    private function customerPrivacySerach($email)
    {
        $response = new NewsletterProPrivacyDataResponse(NewsletterProPrivacyDataResponse::TYPE_SEARCH, 'customer', $email);

        try {
            $count = (int)Db::getInstance()->getValue('
                SELECT COUNT(*) FROM `' . _DB_PREFIX_ . 'customer` WHERE `email` = "' . pSQL($email) . '"
            ');
            $response->addToCount($count);
        } catch (Exception $e) {
            $response->addException($e);
        }

        return $response;
    }

    private function customerExportPrivacy($email)
    {
        $response = new NewsletterProPrivacyDataResponse(NewsletterProPrivacyDataResponse::TYPE_EXPORT, 'customer', $email);

        try {
            $results = Db::getInstance()->executeS('
                SELECT * FROM `' . _DB_PREFIX_ . 'customer` WHERE `email` = "' . pSQL($email) . '"
            ');

            if (count($results) > 0) {

                $data = null;
                foreach ($results as $row) {
                    if ((bool)$row['active'] == true) {
                        $data = $row;
                        break;
                    }
                }

                if (!isset($data)) {
                    $data = $row;
                }

                $response->addToExport(array(
                    NewsletterPro::getInstance()->l('Customers list') => '',
                    NewsletterPro::getInstance()->l('Subscribed') => ((int)$data['newsletter'] ? NewsletterPro::getInstance()->l('Yes') : NewsletterPro::getInstance()->l('No')),
                    NewsletterPro::getInstance()->l('Firstname') => (string)$data['firstname'],
                    NewsletterPro::getInstance()->l('Lastname') => (string)$data['lastname'],
                    NewsletterPro::getInstance()->l('Email') => (string)$data['email'],
                    NewsletterPro::getInstance()->l('IP address') => (string)$data['ip_registration_newsletter'],
                    NewsletterPro::getInstance()->l('Date add') => (string)$data['date_add'],
                ));
            }

            
        } catch (Exception $e) {
            $response->addException($e);
        }

        return $response;
    }

    private function emailsubscriptionClearPrivacy($email)
    {
        $response = new NewsletterProPrivacyDataResponse(NewsletterProPrivacyDataResponse::TYPE_CLEAR, 'emailsubscription', $email);

        if (!NewsletterProTools::tableExists('emailsubscription')) {
            return $response;
        }

        try {
            if (Db::getInstance()->delete('emailsubscription', '`email` = "' . pSQL($email) . '"')) {
                $response->addToCount(Db::getInstance()->Affected_Rows());
            }
        } catch (Exception $e) {
            $response->addException($e);
        }

        return $response;
    }

    private function newsletterClearPrivacy($email)
    {
        $response = new NewsletterProPrivacyDataResponse(NewsletterProPrivacyDataResponse::TYPE_CLEAR, 'newsletter', $email);

        if (!NewsletterProTools::tableExists('newsletter')) {
            return $response;
        }

        try {
            if (Db::getInstance()->delete('newsletter', '`email` = "' . pSQL($email) . '"')) {
                $response->addToCount(Db::getInstance()->Affected_Rows());
            }
        } catch (Exception $e) {
            $response->addException($e);
        }

        return $response;
    }

    private function customerClearPrivacy($email)
    {
        $response = new NewsletterProPrivacyDataResponse(NewsletterProPrivacyDataResponse::TYPE_CLEAR, 'customer', $email);

        try {
            if (Db::getInstance()->update('customer', array(
                'newsletter' => 0,   
            ), '`email` = "' . pSQL($email) . '"')) {
                $res = $this->customerPrivacySerach($email);
                $data = $res->toArray();
                $response->addToCount((int)$data['count']);
            }
        } catch (Exception $e) {
            $response->addException($e);
        }

        return $response;
    }
}
