<?php
//@*--


class Theme_Designer_Model_Export_Position {
    /**
     * @param $list
     * @param $updateData
     * @return string
     */
    public function update($list, $updateData) {
        if (!is_array($updateData) || !array_key_exists('current', $updateData) || !is_array($updateData['current'])) return;
        foreach ($updateData['current'] as $position => $blocks) {
            if (!is_array($blocks)) continue;
            // вычитываем все ордеры для текущего позишена
            $orders = $this->_getPositionOrders($list, $position);
            // если был добавлен новый блок,
            // проверяем все на присутствие в текущем ордер списке и добавляем ордер отсутствующего блока
            if (count($blocks) > count($orders)) {
                foreach ($blocks as $block) {
                    $blockInfo = $this->getBlockInfoById($list, $block);
                    if (is_null($blockInfo)) continue;
                    if (!in_array($blockInfo['order'], $orders)) {
                        $orders[] = $blockInfo['order'];
                    }
                }
                sort($orders);
            } else if (count($blocks) < count($orders)) {
                // если количество блоков в позишене стало меньше,
                // оставляем только ордеры существующих блоков
                $orders = array();
                foreach ($blocks as $block) {
                    $blockInfo = $this->getBlockInfoById($list, $block);
                    if (is_null($blockInfo)) continue;
                    $orders[] = $blockInfo['order'];
                }
                sort($orders);
            }
            // обновляем информацию о блоках в базе сопоставляя порядок блоков с текущим ордер списком
            foreach ($blocks as $block) {
                $pos = array_search($block, $blocks);
                if ($pos === false || !isset($orders[$pos]) || is_null($this->getBlockInfoById($list, $block))) continue;

                /*
                $sql .= nl2br("UPDATE `designer_positions` SET position = " . $position .
                    ", `order` = " . $orders[$pos] . " WHERE block_id = " . $block . "\n");
                */
                $model = Mage::getModel('designer/position')->load($block);
                $model->setPosition($position);
                $model->setOrder($orders[$pos]);
                $model->save();

            }
        }

        if (array_key_exists('templates', $updateData) && is_array($updateData['templates'])) {
            foreach ($list as $blockInfo) {
                if (!Mage::helper('designer')->arrayRecursiveSearch($blockInfo['position'], $updateData['templates'])
                        && $blockInfo['position'] !== 'left' && $blockInfo['position'] !== 'right') {
                    $model = Mage::getModel('designer/position')->load($blockInfo['id']);
                    $model->delete();
                }
            }
        }
    }

    /**
     * @param $list
     * @param $position
     * @return array
     */
    private function _getPositionOrders($list, $position) {
        $orders = array();
        foreach ($list as $blockInfo) {
            if ($blockInfo['position'] == $position) {
                array_push($orders, $blockInfo['order']);
            }
        }
        return $orders;
    }

    /**
     * @param $list
     * @param $id
     * @return null
     */
    public function getBlockInfoById($list, $id) {
        foreach ($list as $blockInfo) {
            if ($blockInfo['id'] == $id) {
                return $blockInfo;
            }
        }
        return null;
    }
}
//--*@