env(LogEnv::SYNC()); $module = Module::getInstanceByName('x13allegro'); echo '
';

if (!Module::getModuleIdByName($module->name)) {
    $error = 'Module is not installed';
} else if (!$module->active) {
    $error = 'Module is not active';
} else if (Tools::getValue('token') != XAllegroConfiguration::get('SYNC_TOKEN')) {
    $error = 'Token error';
}

if ($error) {
    $log->error(LogType::CRON_BOOTSTRAP(), $error);
    exit;
}

try {
    $processLock = new ProcessLock('sync', $module);
} catch (Exception $e) {
    $error = (string)$e;
    exit;
}

if (false !== ($lockTime = ProcessLock::isLocked())) {
    $log->error(LogType::CRON_MAX_ONE_INSTANCE(), "LOCKED BY $lockTime sec");

    if (!$processLock->isNoLock()) {
        exit;
    }
}

$log->blank('sync-start');
$processLock->lock();

// disable PrestaShop Cache during sync process
if (version_compare(_PS_VERSION_, '1.6.1.0', '>=')) {
    Db::getInstance()->disableCache();
}
if (method_exists('ObjectModel', 'disableCache')) {
    ObjectModel::disableCache();
}

$log->config([
    'module' => X13_ALLEGRO_VERSION,
    'prestashop' => _PS_VERSION_,
    'php' => phpversion()
]);
$log->config(XAllegroConfiguration::getMultiple([
    'QUANITY_CHECK',
    'QUANITY_ALLEGRO_UPDATE',
    'QUANITY_ALLEGRO_ALWAYS_MAX',
    'QUANITY_ALLEGRO_VALUE_MAX',
    'CLOSE_AUCTION_TRESHOLD',
    'PRODUCT_ASSOC_CLOSE_UNACTIVE',
    'PRODUCT_ASSOC_CLOSE_UNACTIVE_DB',
    'PRODUCT_ASSOC_CLOSE_DELETED'
]));
$log->config(XAllegroConfiguration::getMultiple([
    'QUANTITY_AUTO_RENEW',
    'QUANTITY_AUTO_RENEW_THRESHOLD',
    'PRODUCT_ASSOC_RENEW_ONLY_ACTIVE',
    'PRODUCT_ASSOC_RENEW_ACTIVE',
    'PRODUCT_ASSOC_RENEW_ACTIVE_DB'
]));
$log->config(XAllegroConfiguration::getMultiple([
    'IMPORT_ORDERS',
    'ORDER_IMPORT_UNASSOC_PRODUCTS',
    'ORDER_IMPORT_UNASSOC_SUMMARY',
    'QUANITY_SHOP_UPDATE',
    'ORDER_ALLEGRO_SEND_SHIPPING'
]));
$log->config(XAllegroConfiguration::getMultiple([
    'UPDATE_OFFERS_CHUNK',
    'IMPORT_ORDERS_CHUNK',
    'DELETE_ARCHIVED_OFFERS',
    'QUANITY_ALLEGRO_OOS',
    'QUANITY_ALLEGRO_HOOK_SKIP'
]));

// check offers processes
$log->blank('process-manager-start');
(new OfferProcessManager())->checkProcessesStatus();
$log->blank('process-manager-end');

// Offers can be active on many accounts at the same time
// so we need to listen events separately for all accounts
$accounts = (new PrestaShopCollection(XAllegroAccount::class))
    ->where('active', '=', 1)
    ->getResults();

// $txt = "\n\n==============PrestaShopCollection=====================\n".  print_r($accounts, true)."\n =================END PrestaShopCollection====================\n\n";
// file_put_contents(dirname(__FILE__).'/sync.log', $txt.PHP_EOL , FILE_APPEND | LOCK_EX);
//
//
// $txt = "\n\n==============UPDATE_OFFERS_CHUNK=====================\n".  print_r((int)XAllegroConfiguration::get('UPDATE_OFFERS_CHUNK'), true)."\n =================END UPDATE_OFFERS_CHUNK====================\n\n";
// file_put_contents(dirname(__FILE__).'/sync.log', $txt.PHP_EOL , FILE_APPEND | LOCK_EX);

$log->blank('offer-event-start');
foreach ($accounts as $account) {
    try {
        $listener = new OfferEventListener($account);

        // $txt = "\n\n==============OfferEventListener=====================\n".  print_r($listener, true)."\n =================END OfferEventListener====================\n\n";
        // file_put_contents(dirname(__FILE__).'/sync.log', $txt.PHP_EOL , FILE_APPEND | LOCK_EX);
        //
        // $txt = "\n\n==============PRICE_CHANGED=====================\n".  print_r(OfferEventType::PRICE_CHANGED, true)."\n =================END PRICE_CHANGED====================\n\n";
        // file_put_contents(dirname(__FILE__).'/sync.log', $txt.PHP_EOL , FILE_APPEND | LOCK_EX);

        $listener->listen([
            OfferEventType::ACTIVATED,
            OfferEventType::ENDED,
            OfferEventType::ARCHIVED,
            OfferEventType::PRICE_CHANGED,
            OfferEventType::VISIBILITY_CHANGED
        ], (int)XAllegroConfiguration::get('UPDATE_OFFERS_CHUNK') * 3);
    }
    catch (Exception $ex) {}
}
$log->blank('offer-event-end');

$log->blank('order-event-start');
foreach ($accounts as $account) {
    try {
        $listener = new OrderEventListener($account);
        $listener->listen([
            OrderEventType::FILLED_IN,
            OrderEventType::READY_FOR_PROCESSING,
            OrderEventType::AUTO_CANCELLED,
            OrderEventType::BUYER_CANCELLED,
            OrderEventType::FULFILLMENT_STATUS_CHANGED
        ], (int)XAllegroConfiguration::get('IMPORT_ORDERS_CHUNK'));
    }
    catch (Exception $ex) {}
}
$log->blank('order-event-end');

// fix Context
$context = Context::getContext();
$context->customer = null;
$context->cart = null;

try {
    // updating Offer status on Allegro
    $log->blank('publication-status-start');
    (new PublicationStatusEnd())->updateFromCron();
    (new PublicationStatusActive())->updateFromCron();
    $log->blank('publication-status-end');

    // updating Offer stock on Allegro
    $log->blank('quantities-start');
    (new QuantityUpdater())->updateFromCron();
    $log->blank('quantities-end');

    // updating Offer prices on Allegro
    // $log->blank('prices-start');
    // (new PriceUpdater())->updateFromCron();
    // $log->blank('prices-end');

    // send Order tracking number to Allegro
    $log->blank('shipping-start');
    XAllegroSyncShipping::syncShipping();
    $log->blank('shipping-end');
}
catch (Exception $ex) {
    $log->exception($ex);
}

XAllegroAuction::deleteArchivedAuctions((int)XAllegroConfiguration::get('DELETE_ARCHIVED_OFFERS'));
LogMailer::sendLogs();

$processLock->unLock();
$log->blank('sync-end');

echo sprintf('exec time (sec): %.2f', microtime(true) - $start);
echo '
'; exit;