<?php
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();

use Bitrix\Main\Loader,
    Bitrix\Main\UserTable,
    Bitrix\Iblock\SectionTable,
    Bitrix\Iblock\PropertyTable,
    Bitrix\Iblock\PropertyEnumerationTable,
    Bitrix\Iblock\ElementTable,
    Bitrix\Catalog\Model\Price,
    Bitrix\Main\Mail\Event;

if (
    !Loader::includeModule('iblock') ||
    !Loader::includeModule('catalog')
) {
    die('Модули iblock или catalog не подключены');
}

class BulletinFormNew extends CBitrixComponent
{

    private $propertiesIds = []; // ID cвойств для передачи между методами

    // Подготовка параметров компонента
    public function onPrepareComponentParams($arParams)
    {
        return $arParams;
    }


    // Информация о пользователе ========================================
    protected function getUserData($userId)
    {
        return UserTable::getList([
            'filter' => ['ID' => $userId],
            'select' => ['*']
        ])->fetch();
    }


    // Получение разделов  ==============================================
    protected function getSections($parentId = null)
    {
        $filter['IBLOCK_ID'] = $this->arParams['IBLOCK_ID'];
        if ($parentId == null) { // Не выбран корневой
            $filter['DEPTH_LEVEL'] = 1;
        } else { // Выбран корневой дополучим потомков
            $filter['=IBLOCK_SECTION_ID'] = $parentId;
        }
        return SectionTable::getList([
            'filter' => $filter,
            'order' => [
                'NAME' => 'ASC'
            ],
            'select' => [
                'ID', 'IBLOCK_SECTION_ID', 'NAME'
            ],
            'cache' => [
                'ttl' => '360000'
            ]
        ])->fetchAll();
    }


    // Свойства ==========================================================
    protected function getProperties()
    {
        $properties = [];

        $rsProperties = PropertyTable::getList([
            'filter' => [
                'IBLOCK_ID' => $this->arParams['IBLOCK_ID']
            ],
            'select' => [
                'ID', 'NAME', 'CODE', 'PROPERTY_TYPE', 'MULTIPLE'
            ]
        ]);

        while ($property = $rsProperties->fetch()) {
            $properties[$property['CODE']] = $property;
            $this->propertiesIds[] = $property['ID'];
            // Если свойство - это множественный список
            if ($property['PROPERTY_TYPE'] === 'L' && $property['MULTIPLE'] === 'Y') {
                $properties[$property['CODE']]['ENUM_VALUES'] = PropertyEnumerationTable::getList([
                    'filter' => [
                        'PROPERTY_ID' => $property['ID']
                    ],
                    'select' => [
                        'ID', 'VALUE'
                    ]
                ])->fetchAll();
            }
        }
        return $properties;
    }


    // Проверка права на редактирование элемента   =============================================
    protected function canEditElement($elementCreatedBy, $userId)
    {
        return $elementCreatedBy === $userId;
    }


    // Получение редактируемого элемента =================================================
    protected function getElement($elementId)
    {
        $elementDatas = [];
        $dbElement = ElementTable::getList([
            'filter' => [
                'IBLOCK_ID' => $this->arParams['IBLOCK_ID'],
                'ID' => $elementId
            ],
            'select' => [
                'ID',
                'NAME',
                'IBLOCK_SECTION_ID',
                'DETAIL_TEXT',
                'DETAIL_PICTURE',
                'CREATED_BY'
            ]
        ]);
        if ($arElement = $dbElement->fetch()) {

            // Основные данные элемента
            $elementDatas = $arElement;

            // Основную фотку добавляем в общий массив фоток первой
            $elementDatas['MORE_PHOTO'][] = $elementDatas['DETAIL_PICTURE'];

            // Получаем свойства
            $rsPropertyValues = CIBlockElement::getProperty(
                $this->arParams['IBLOCK_ID'],
                $elementId,
                array(),
                array(
                    'ID' => $this->propertiesIds
                )
            );
            while ($arProp = $rsPropertyValues->fetch()) {
                if ($arProp['MULTIPLE'] === 'Y') {
                    $elementDatas[$arProp['CODE']][] = $arProp['VALUE'];
                } else {
                    $elementDatas[$arProp['CODE']] = $arProp['VALUE'];
                }
            }

            // Получаем цену
            $priceIterator = Price::getList([
                'filter' => [
                    '=PRODUCT_ID' => $elementId,
                    '=CATALOG_GROUP_ID' => '1'
                ],
                'select' => [
                    'ID', 'PRICE'
                ]
            ]);
            if ($price = $priceIterator->fetch()) {
                $elementDatas['PRICE'] = $price;
            }
        }
        // Дополучаем цепочку разделов элемента
        $sectionChain = CIBlockSection::GetNavChain(
            false,
            $elementDatas['IBLOCK_SECTION_ID'],
            ['NAME', 'ID'],
            true // Производительнее чем false и нам достаточно
        );
        foreach ($sectionChain as $arSectionPath) {
            $elementDatas['SECTIONS_CHAIN'][] = $arSectionPath;
        }
        // $this->sectionOnEditId = $elementDatas['IBLOCK_SECTION_ID'];
        return $elementDatas;
    }


    public function processElementSave($postData)
    {
        $el = new CIBlockElement();

        // Заполняем свойства кроме фотографий
        $postedProperty = [];
        foreach ($this->arResult['PROPERTIES'] as $k => $PostProperty) {
            if ($k !== 'MORE_PHOTO') {
                $postedProperty[$k] = $postData[$k];
            }
        }

        // Обрабатываем фотографии
        $arMorePhoto = [];
        foreach ($postData['MORE_PHOTO'] as $key => $tmpName) {
            $arMorePhoto[] = [
                'VALUE' => CFile::MakeFileArray('/upload/tmp' . $tmpName['tmp_name'], $tmpName['type']),
                'NAME' => $tmpName['name']
            ];
        }

        foreach ($arMorePhoto as $k => $reName) {
            $arMorePhoto[$k]['VALUE']['name'] = $arMorePhoto[$k]['NAME'];
        }

        $postedProperty['MORE_PHOTO'] = $arMorePhoto;

        // Извлекаем первую фотографию для детальной картинки
        $detaiPhoto = array_shift($postedProperty['MORE_PHOTO']);
        $arFields = [];
        // Формируем массив полей для добавления/обновления элемента
        $arFields = [
            "IBLOCK_ID" => intval($this->arParams['IBLOCK_ID']),
            "NAME" => htmlspecialchars(strip_tags($postData['NAME']), ENT_QUOTES, 'UTF-8'),
            'CREATED_BY' => intval($this->arResult['USER']['ID']),
            'ACTIVE' => 'N',
            'ACTIVE_FROM' => '',
            'ACTIVE_TO' => '',
            'DETAIL_PICTURE' => is_array($detaiPhoto) ? $detaiPhoto['VALUE'] : null,
            'PREVIEW_PICTURE' => is_array($detaiPhoto) ? $detaiPhoto['VALUE'] : null,
            'DETAIL_TEXT' => htmlspecialchars(strip_tags($postData['DETAIL_TEXT']), ENT_QUOTES, 'UTF-8'),
            //'IBLOCK_SECTION_ID' => intval($postData['IBLOCK_SECTION']),
            'PROPERTY_VALUES' => $postedProperty
        ];

        if (!empty($postData['EDIT_ELEMENT'])) { // Обновление элемента

//            foreach ($postData['MORE_PHOTO_del'] as $key => $delete) {
//                if ($delete === 'Y') {
//                    // Удаление фотографий
//                    CFile::Delete($arValues[$key]['VALUE']);
//                }
//            }

            if ($el->Update($postData['EDIT_ELEMENT'], $arFields)) {
                // Обновляем цену todo получить ID через объект метода а не такой соплей
                $priceId = $this->getElement($postData['EDIT_ELEMENT'])['PRICE']['ID'];
                Price::update(
                    $priceId,
                    [
                        'PRODUCT_ID' => $postData['EDIT_ELEMENT'],
                        'CATALOG_GROUP_ID' => 1,
                        'PRICE' => intval($postData['PRICE']),
                        'CURRENCY' => 'RUB',
                    ]
                );
                // Шлем письмо о модерации // todo повторяется, можно вынести в отдельный метод
                Event::send([
                    'EVENT_NAME' => 'MODERATE_BULLETIN_NEW_ITEM',
                    'LID' => 's2',
                    'C_FIELDS' => [
                        'ELEMENT_ID' => $postData['EDIT_ELEMENT']
                    ],
                ]);
                LocalRedirect($this->arParams['LOCAL_REDIRECT']);
            } else {
                $this->arResult['ERRORS'][] = $el->LAST_ERROR;
            }
        } else { // Добавление элемента
            $arFields['IBLOCK_SECTION_ID'] = intval($postData['IBLOCK_SECTION']);
            if ($NewElementId = $el->Add($arFields)) {
                // Добавляем товар
                \Bitrix\Catalog\Model\Product::add([
                    'fields' => [
                        'ID' => $NewElementId,
                        'VAT_INCLUDED' => 'Y'
                    ],
                ]);
                // Добавляем цену
                Price::add([
                    'fields' => [
                        'PRODUCT_ID' => $NewElementId,
                        'CATALOG_GROUP_ID' => 1,
                        'PRICE' => intval($postData['PRICE']),
                        'CURRENCY' => 'RUB',
                    ]
                ]);
                // Шлем письмо модератору // todo повторяется, можно вынести в отдельный метод
                Event::send([
                    'EVENT_NAME' => 'MODERATE_BULLETIN_NEW_ITEM',
                    'LID' => 's2',
                    'C_FIELDS' => [
                        'ELEMENT_ID' => $NewElementId
                    ],
                ]);
                LocalRedirect($this->arParams['LOCAL_REDIRECT']);
            } else {
                $this->arResult['ERRORS'][] = $el->LAST_ERROR;
            }
        }
    }

}


//echo '<pre>';
//print_r(get_class_methods(new BulletinFormNew));
//echo '</pre>';