HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux dev1 5.15.83-1-pve #1 SMP PVE 5.15.83-1 (2022-12-15T00:00Z) x86_64
User: safarimaris (1000)
PHP: 7.2.34-54+ubuntu22.04.1+deb.sury.org+1
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,
Upload Files
File: /home/safarimaris/home/safarimaris/console/controllers/MgController.php
<?php
namespace console\controllers;


use common\models\Product;
use common\models\Region;
use common\models\Site;
use Yii;
use yii\base\Exception;
use yii\console\Controller;

use yii\imagine\Image;
use yii\helpers\ArrayHelper;
use Imagine\Image\ManipulatorInterface;

use common\components\EntityTypes;
use common\models\Entity;
use common\models\EntityBoat;
use common\models\Fleet;
use common\models\Country;

class MgController extends Controller
{
    private $dicAvail = [];
    private static $boats;
    private static $countries;

    public function actionAll($skipImage = false)
    {
        $this->actionRegion();
        $this->actionCountry($skipImage);
        $this->actionFleet();
        $this->actionBoat($skipImage);
        $this->actionBoatDescr();
        $this->actionSite($skipImage);
        $this->actionProduct($skipImage);
    }

    public function actionCountry($skipImage = false)
    {
        echo "migrate country\n";
        Yii::$app->db->createCommand()->delete('country')->execute();
        Yii::$app->db->createCommand()->delete('gallery_image', "type='country'")->execute();

        system("rm -rf " . escapeshellarg(Yii::getAlias('@imgPath/country')));
        mkdir(Yii::getAlias('@imgPath/country'), 0777);

        $res = Yii::$app->dblive->createCommand('
          SELECT cd.parentId, cd.name, i1.name as logo, GROUP_CONCAT(i2.name) as gallery, g.groupId FROM dive_countries_descr cd
          LEFT JOIN dive_countries_media cm1 ON cm1.entityId = cd.parentId AND cm1.mediaUse = 1 and cm1.mediaTypeId = 1
          LEFT JOIN dive_media_images i1 ON i1.id = cm1.mediaId
          LEFT JOIN dive_countries_media cm2 ON cm2.entityId = cd.parentId AND cm2.mediaUse = 3 and cm2.mediaTypeId = 1
          LEFT JOIN dive_media_images i2 ON i2.id = cm2.mediaId
          LEFT JOIN dive_boats_geo_items g ON g.entityId = cd.parentId AND g.entityTypeId = 5
          WHERE cd.languageId = 1
          GROUP BY cd.parentId;
        ')->queryAll();

        $db = Yii::$app->db;
        $i = 1;
        foreach ($res as $item) {
            try {
                $model = new Country();
                $model->id = $item['parentId'];
                $model->regionId = $item['groupId'];
                $model->name = trim($item['name']);
                $model->url = $this->formatUrl($item['name']);
                echo $i . "of" . sizeof($res);
                if ($item['logo'] && !$skipImage) {
                    $amazonImg = 'https://media.divebooker.com/media/images/big/' . $item['logo'];
                    if (!is_file(Yii::getAlias('@imgPath/country/') . $item['logo'])) {
                        @file_put_contents(Yii::getAlias('@imgPath/country/') . $item['logo'], file_get_contents($amazonImg));
                    }
                    if (is_file(Yii::getAlias('@imgPath/country/') . $item['logo'])) {
                        $this->saveThumb($item['logo'], 1, 'country');
                    }

                    $model->logo = $item['logo'];
                }
                $model->save(false);
                if ($item['gallery'] && !$skipImage) {

                    $list = explode(',', $item['gallery']);
                    foreach ($list as $image) {
                        $amazonImg = 'https://media.divebooker.com/media/images/big/' . $image;

                        $db->createCommand()
                            ->insert(
                                '{{%gallery_image}}',
                                [
                                    'type' => 'country',
                                    'ownerId' => $model->id
                                ]
                            )->execute();

                        $id = $db->getLastInsertID('gallery_image_id_seq');
                        $this->createFolders(Yii::getAlias('@imgPath/country/gallery/') . $model->id . '/' . $id . '/original.jpg');

                        if ($content = file_get_contents($amazonImg)) {
                            file_put_contents(Yii::getAlias('@imgPath/country/gallery/') . $model->id . '/' . $id . '/original.jpg', $content);
                            $this->saveThumb(Yii::getAlias('@imgPath/country/gallery/') . $model->id . '/' . $id . '/', 2, 'country');
                        }
                    }
                }
            } catch (Exception $e) {
                Yii::error($e->getMessage());
            }
            echo "\r";
            $i++;
        }
        $this->actionChown('/country');
    }

    public function actionFleet()
    {
        echo "migrate fleet\n";
        Yii::$app->db->createCommand()->delete('dic_fleet')->execute();

        $res = Yii::$app->dblive->createCommand('
          SELECT parentId, name
          FROM dive_boats_fleets_descr
          WHERE languageId = 1 and name != "DELETE";')->queryAll();

        $i = 1;
        foreach ($res as $item) {
            $model = new Fleet();
            $model->id = $item['parentId'];
            $model->name = trim($item['name']);
            $model->save(false);
            echo $i."of".sizeof($res)."\r";
            $i++;
        }
    }

    public function actionRegion()
    {
        echo "migrate region\n";
        Yii::$app->db->createCommand()->delete('region')->execute();

        $res = Yii::$app->dblive->createCommand('
          SELECT parentId, name
          FROM dive_boats_geo_groups_descr
          WHERE languageId = 1
          GROUP BY parentId;')->queryAll();

        $i = 1;
        foreach ($res as $item) {
            $model = new Region();
            $model->id = $item['parentId'];
            $model->ordinal = $item['parentId'];
            $model->name = trim($item['name']);
            $model->save(false);
            echo $i."of".sizeof($res)."\r";
            $i++;
        }
    }

    public function actionDictionary()
    {
        $this->dictionary(38, '{{%dic_material}}');
        $this->dictionary(1, '{{%dic_language}}');
        $this->dictionary(35, '{{%dic_navigation}}');
        $this->dictionary(36, '{{%dic_food}}');
        $this->dictionary(37, '{{%dic_service}}');
        $this->dictionary(39, '{{%dic_document}}');
        $this->dictionary(45, '{{%dic_diving}}');

    }

    public function actionBoat($skipImage = false)
    {
        echo "migrate boat\n";
        Yii::$app->db->createCommand()->delete('entity')->execute();
        Yii::$app->db->createCommand()->delete('entity_boat')->execute();
        if (!$skipImage) {
            Yii::$app->db->createCommand()->delete('gallery_image', "type='entity'")->execute();

            system("rm -rf " . escapeshellarg(Yii::getAlias('@imgPath/entity')));
            mkdir(Yii::getAlias('@imgPath/entity'), 0777);
        }

        $this->actionDictionary();
        $res = Yii::$app->dblive->createCommand('
          SELECT 
            b.*,
            bc.countryId,
            bd.name,
            bd.descr,
            bd.engines,
            bd.tenders,
            bd.compressors,
            bd.generator,
            bd.powerPlugsOnboard,
            i1.name as logo, 
            i3.name as boatPlan, 
            GROUP_CONCAT(i2.name) as gallery
          FROM dive_boats b
          INNER JOIN dive_boats_descr bd ON bd.parentId = b.id AND bd.languageId = 1
          INNER JOIN dive_boats_counties bc ON bc.boatId = b.id
          LEFT JOIN dive_boats_media cm1 ON cm1.entityId = b.id AND cm1.mediaUse = 1 and cm1.mediaTypeId = 1
          LEFT JOIN dive_media_images i1 ON i1.id = cm1.mediaId
          LEFT JOIN dive_boats_media cm2 ON cm2.entityId = b.id AND cm2.mediaUse = 3 and cm2.mediaTypeId = 1
          LEFT JOIN dive_media_images i2 ON i2.id = cm2.mediaId
          LEFT JOIN dive_boats_media cm3 ON cm3.entityId = b.id AND cm3.mediaUse = 11 and cm3.mediaTypeId = 1
          LEFT JOIN dive_media_images i3 ON i3.id = cm3.mediaId
          WHERE b.active = 1
          GROUP BY b.id
        ')->queryAll();

        $db = Yii::$app->db;
        $i = 1;
        foreach ($res as $item) {
            try{
                $model = new Entity();
                $model->setScenario('default');
                $model->id = $item['id'];
                $model->description = $item['descr'];
                $model->countryId = $item['countryId'];
                $model->name = trim($item['name']);
                $model->type = EntityTypes::TYPE_BOAT;
                $model->seoUrl = $this->formatUrl($item['name']);
                $model->nitrox = $item['nitroxId'];
                $model->wifi = $item['wifiId'];
                $model->techDiving = 0;

                echo $i . "of" . sizeof($res);
                if ($item['logo']) {
                    $amazonImg = 'https://media.divebooker.com/media/images/big/' . $item['logo'];
                    if (!is_file(Yii::getAlias('@imgPath/entity/') . $item['logo']) && !$skipImage) {
                        if ($content = @file_get_contents($amazonImg)) {
                            file_put_contents(Yii::getAlias('@imgPath/entity/') . $item['logo'], $content);
                            $this->saveThumb($item['logo'], 1, 'entity');
                        }
                    }
                    $model->logo = $item['logo'];
                }

                $model->save(false);
                $extended = $model->findExtended();
                if (!$extended) {
                    $extended = new EntityBoat();
                }
                $extended->id = $extended->entityId = $model->id;
                $extended->setScenario('default');
                $extended->setAttributes($item);

                $extended->fleetId = $item['fleetId'];
                $extended->year = $item['yearBuilt'];
                $extended->materialId = $item['material'];
                $extended->countCabin = $item['numberCabins'];
                if ($item['boatPlan'] && !$skipImage) {
                    $amazonImg = 'https://media.divebooker.com/media/images/big/'.$item['boatPlan'];
                    if (!is_file(Yii::getAlias('@imgPath/entity_boat/').$item['boatPlan'])) {
                        if ($content = @file_get_contents($amazonImg)) {
                            @file_put_contents(Yii::getAlias('@imgPath/entity_boat/').$item['boatPlan'], $content);
                            $this->saveThumb($item['boatPlan'], 1, 'entity_boat');
                        }
                    }
                    $extended->boatPlan = $item['boatPlan'];

                }
                $extended->compressor = $item['compressors'];
                $extended->engine = $item['engines'];
                $extended->tender = $item['tenders'];
                $extended->socket = $item['powerPlugsOnboard'];
                $extended->techEquip = $item['equippedTechDiving'];
                $extended->disabilitiesEquip = $item['diversWithDisabilities'];
                $extended->lastDockDate = $item['lastDockDate'] == '0000-00-00' ? null : $item['lastDockDate'];
                $extended->lastRenovationDate = $item['lastRenovationDate'] == '0000-00-00' ? null : $item['lastRenovationDate'];
                $extended->save(false);

                //properties
                $props = Yii::$app->dblive->createCommand('
                  SELECT 
                    propertyTypeId, propertyValues
                  FROM dive_boats_properties 
                  
                  WHERE entityId = :entityId AND propertyTypeId IN(1, 35, 36, 37, 39, 45);
                ')->bindValue(':entityId', $model->id)
                    ->queryAll();

                if ($props) {

                    foreach($props as $prop) {
                        $data = [];
                        foreach (explode('~', $prop['propertyValues']) as $vl) {
                            if (in_array($vl, $this->dicAvail[$prop['propertyTypeId']]))
                                $data[] = [$model->id, $vl];
                        }

                        switch ($prop['propertyTypeId']) {
                            case 1:
                                $this->saveDic('{{%entity_language_link}}', $data, 'languageId');
                                break;
                            case 35:
                                $this->saveDic('{{%entity_boat_navigation_link}}', $data, 'navigationId');
                                break;
                            case 36:
                                $this->saveDic('{{%entity_boat_food_link}}', $data, 'foodId');
                                break;
                            case 37:
                                $this->saveDic('{{%entity_boat_service_link}}', $data, 'serviceId');
                                break;
                            case 39:
                                $this->saveDic('{{%entity_document_link}}', $data, 'documentId');
                                break;
                            case 45:
                                $this->saveDic('{{%entity_boat_diving_link}}', $data, 'divingId');
                                foreach ($data as $d) {
                                    if ($d[1] == 1093) {//tech diving

                                        $db->createCommand()
                                            ->update(
                                                '{{%entity}}',
                                                ['techDiving' => 1],
                                                ['id' => $model->id]
                                            )->execute();

                                    }
                                }

                                break;
                        }

                    }
                }

                $gallery = Yii::$app->dblive->createCommand('
                  SELECT 
                    i.name
                  FROM dive_boats_media m
                  INNER JOIN dive_media_images i ON i.id = m.mediaId
                  WHERE entityId = :entityId AND m.mediaUse = 3 and m.mediaTypeId = 1;
                ')->bindValue(':entityId', $model->id)
                    ->queryColumn();

                if ($gallery && !$skipImage) {
                    foreach ($gallery as $image) {
                        $amazonImg = 'https://media.divebooker.com/media/images/big/'.$image;

                        $db->createCommand()
                            ->insert(
                                '{{%gallery_image}}',
                                [
                                    'type' => 'entity',
                                    'ownerId' => $model->id
                                ]
                            )->execute();

                        $id = $db->getLastInsertID('gallery_image_id_seq');

                        $this->createFolders(Yii::getAlias('@imgPath/entity/gallery/').$model->id.'/'.$id.'/original.jpg');
                        if ($content = @file_get_contents($amazonImg)) {
                            file_put_contents(Yii::getAlias('@imgPath/entity/gallery/').$model->id.'/'.$id.'/original.jpg', $content);
                            $this->saveThumb(Yii::getAlias('@imgPath/entity/gallery/').$model->id.'/'.$id.'/', 2, 'entity');
                        }
                    }
                }
            } catch (Exception $e) {
                Yii::error($e->getMessage());
            }
            echo "\r";
            $i++;
        }
        $this->actionChown('/entity');
    }

    public function actionBoatDescr()
    {
        echo "migrate product descr\n";

        $res = Yii::$app->dbsm->createCommand('
          SELECT 
            p.ID, 
            p.post_title as name,
            p.post_name as url,
            CONCAT(p.post_content, " ", cabin.meta_value) as description

          FROM wp_posts p
          INNER JOIN wp_postmeta cabin ON cabin.post_id = p.ID AND cabin.meta_key = "_simple_fields_fieldGroupID_20_fieldID_1_numInSet_0"
          WHERE p.post_type = "yachts" and p.post_status = "publish";
        ')->queryAll();

        $i = 1;

        foreach ($res as $item) {

            try {
                echo $i . "of" . sizeof($res);
                $boatId = $this->getBoatId($item['url']);

                if (!$boatId) {
                    $i++;
                    echo "\r";
                    Yii::info('Not found boat'.$item['url']);
                    continue;
                }

                $model = Entity::findOne($boatId);
                $model->description = $item['description'];
                $model->save(false);
            } catch (Exception $e) {
                Yii::error($e->getMessage());
            }
            echo "\r";
            $i++;
        }
    }

    public function actionSite($skipImage = false)
    {
        echo "migrate site\n";
        Yii::$app->db->createCommand()->delete('{{%site}}')->execute();

        system("rm -rf " . escapeshellarg(Yii::getAlias('@imgPath/site')));
        mkdir(Yii::getAlias('@imgPath/site'), 0777);

        $res = Yii::$app->dbsm->createCommand('
          SELECT 
            p.ID, 
            p.post_title as name,
            p.post_name as url,
            p.post_content as description,
            p1.guid as logo,
            t.slug as countryUrl
          FROM wp_posts p
          LEFT JOIN wp_postmeta pm1 ON pm1.post_id = p.ID AND pm1.meta_key = "_thumbnail_id"
          LEFT JOIN wp_posts p1 ON p1.ID = pm1.meta_value
          LEFT JOIN wp_term_relationships as r ON r.object_id = p.ID
          LEFT JOIN wp_term_taxonomy as tx ON tx.term_taxonomy_id = r.term_taxonomy_id AND tx.taxonomy = "country"
          LEFT JOIN wp_terms t ON t.term_id = tx.term_id
          WHERE p.post_type = "site" and p.post_status = "publish" 
          GROUP BY p.ID;
        ')->queryAll();

        $i = 1;
        foreach ($res as $item) {
            try {
                $countryId = $this->getCountryId($item['countryUrl']);
                /*if (!$countryId) {
                    continue;
                }*/

                $model = new Site();
                $model->setScenario('default');
                $model->id = $item['ID'];
                $model->countryId = $countryId;

                $model->name = $item['name'];
                $model->description = $item['description'];
                $model->url = $item['url'];

                echo $i . "of" . sizeof($res);
                if ($item['logo'] && !$skipImage) {
                    $filename = uniqid().'.'.pathinfo($item['logo'], PATHINFO_EXTENSION);
                    if (!is_file(Yii::getAlias('@imgPath/site/') . $filename)) {
                        if ($content = @file_get_contents($item['logo'])) {
                            file_put_contents(Yii::getAlias('@imgPath/site/') . $filename, $content);
                            $this->saveThumb($filename, 1, 'site');
                        }
                    }
                    $model->logo = $filename;
                }
                $model->save(false);
            } catch (Exception $e) {
                Yii::error($e->getMessage());
            }
            echo "\r";
            $i++;
        }
        $this->actionChown('/site');
    }

    public function actionProduct($skipImage = false)
    {
        echo "migrate product\n";
        Yii::$app->db->createCommand()->delete('product')->execute();

        system("rm -rf " . escapeshellarg(Yii::getAlias('@imgPath/product')));
        mkdir(Yii::getAlias('@imgPath/product'), 0777);

        $res = Yii::$app->dbsm->createCommand('
          SELECT 
            p.ID, 
            p.post_title as name,
            CONCAT(p.post_content, " ", pm6.meta_value, " ", pm7.meta_value) as descr,
            pb.id as BoatId,
            pb.post_name as boatUrl,
            pm1.meta_value as include,
            pm2.meta_value as notInclude,
            pm3.meta_value as additionalCost,
            pm4.meta_value as sites,
            p5.guid as logo
          FROM wp_posts p
          INNER JOIN wp_postmeta pmb ON pmb.post_id = p.ID AND pmb.meta_key = "yacht-tur"
          INNER JOIN wp_posts pb ON pb.ID = pmb.meta_value
          INNER JOIN wp_postmeta pm1 ON pm1.post_id = p.ID AND pm1.meta_key = "_simple_fields_fieldGroupID_6_fieldID_1_numInSet_0"
          INNER JOIN wp_postmeta pm2 ON pm2.post_id = p.ID AND pm2.meta_key = "_simple_fields_fieldGroupID_6_fieldID_2_numInSet_0"
          INNER JOIN wp_postmeta pm3 ON pm3.post_id = p.ID AND pm3.meta_key = "_simple_fields_fieldGroupID_6_fieldID_3_numInSet_0"
          INNER JOIN wp_postmeta pm4 ON pm4.post_id = p.ID AND pm4.meta_key = "wpsc-tur-sites"
          INNER JOIN wp_postmeta pm5 ON pm5.post_id = p.ID AND pm5.meta_key = "_thumbnail_id"
          INNER JOIN wp_posts p5 ON p5.ID = pm5.meta_value
          INNER JOIN wp_postmeta pm6 ON pm6.post_id = p.ID AND pm6.meta_key = "_simple_fields_fieldGroupID_5_fieldID_5_numInSet_0"
          INNER JOIN wp_postmeta pm7 ON pm7.post_id = p.ID AND pm7.meta_key = "_simple_fields_fieldGroupID_5_fieldID_6_numInSet_0"
          WHERE p.post_type = "turs" and p.post_status = "publish";
        ')->queryAll();

        $allSites = Yii::$app->db->createCommand('SELECT id FROM {{%site}};')->queryColumn();
        $db = Yii::$app->db;
        $i = 1;

        foreach ($res as $item) {
            try {
                echo $i . "of" . sizeof($res);
                $boatId = $this->getBoatId($item['boatUrl']);
                if (!$boatId) {
                    $i++;
                    echo "\r";
                    Yii::info('Not found boat'.$item['boatUrl']);
                    continue;
                }

                $model = new Product();
                $model->setScenario('default');
                $model->id = $item['ID'];
                $model->name = $item['name'];
                $model->descr = $item['descr'];
                $model->entityId = $boatId;
                $model->include = $item['include'];
                $model->notInclude = $item['notInclude'];
                $model->additionalCost = $item['additionalCost'];
                $model->itinerary = $this->getItinerary($model->id);
                $model->save(false);

                //sites
                $sites = json_decode($item['sites']);

                if ($item['sites'] && sizeof($sites)) {
                    $data = [];
                    foreach($sites as $site) {
                        if (in_array($site, $allSites))
                            $data[] = [$model->id, $site];

                        if ($data) {
                            $sql = Yii::$app->db->queryBuilder->batchInsert('{{%product_site_link}}', ['productId', 'siteId'], $data);
                            $sql = 'INSERT IGNORE' . substr( $sql, strlen( 'INSERT' ) );
                            Yii::$app->db->createCommand($sql)->execute();
                        }

                    }
                }

                if ($item['logo'] && !$skipImage) {
                    $ext = pathinfo($item['logo'], PATHINFO_EXTENSION);
                    if ($ext) {
                        $filename = $model->id.'.'.$ext;
                        if (!is_file(Yii::getAlias('@imgPath/product/') . $filename)) {
                            if ($content = @file_get_contents($item['logo'])) {
                                file_put_contents(Yii::getAlias('@imgPath/product/') . $filename, $content);
                                $this->saveThumb($filename, 1, 'product');
                            }
                        }
                        $model->logo = $filename;
                        $model->save(false);
                    }
                }
            } catch (Exception $e) {
                Yii::error($e->getMessage());
            }
            echo "\r";
            $i++;
        }
        $this->actionChown('/product');
    }

    public function actionChown($dir = '')
    {
        echo "chown ".$dir."\n";
        system("chown -R apache:apache " . escapeshellarg(Yii::getAlias('@imgPath'.$dir)));
    }

    private function dictionary($typeId, $dest)
    {
        $this->dicAvail[$typeId] = [];
        $db = Yii::$app->db;
        $db->createCommand()->delete($dest)->execute();

        $res = Yii::$app->dblive->createCommand('
          SELECT id, name
          FROM dive_catalog_properties
          WHERE propertyTypeId = :typeId;')
            ->bindValue(':typeId', $typeId)
            ->queryAll();


        $i = 1;
        echo "migrate ".$dest."\n";
        foreach ($res as $item) {
            $db->createCommand()
                ->insert(
                    $dest,
                    [
                        'id' => $item['id'],
                        'name' => $this->translate($item['name'])
                    ]
                )->execute();
            echo $i."of".sizeof($res);
            echo "\r";
            $i++;
            $this->dicAvail[$typeId][] = $item['id'];
        }
    }

    private function getItinerary($id)
    {
        $str = '';
        $meta = Yii::$app->dbsm->createCommand('
                  SELECT meta_key, meta_value
                  FROM wp_postmeta 
                  WHERE post_id = :postId
                  ORDER BY meta_key;
                ')->bindValue(':postId', $id)
            ->queryAll();
        $struct = array();
        foreach ($meta as $m) {
            if (strstr($m['meta_key'], '_simple_fields_fieldGroupID_13')) {
                $struct[$m['meta_key']] = $m['meta_value'];
            }
        }

        for ($i = 0; $i < sizeof($struct) / 4; $i++) {
            $str .= sprintf("<p>%s день %s</p> %s",
                $struct['_simple_fields_fieldGroupID_13_fieldID_1_numInSet_'.$i],
                $struct['_simple_fields_fieldGroupID_13_fieldID_2_numInSet_'.$i],
                $struct['_simple_fields_fieldGroupID_13_fieldID_3_numInSet_'.$i]
            );
        }
        return $str;
    }

    private function saveDic($table, $data, $fldName)
    {
        $sql = Yii::$app->db->queryBuilder->batchInsert($table, ['entityId', $fldName], $data);
        $sql = 'INSERT IGNORE' . substr( $sql, strlen( 'INSERT' ) );
        Yii::$app->db->createCommand($sql)->execute();
    }

    private function formatUrl($url)
    {
        return str_replace([' ', '&', '(', ')', '.', ','], ['-', 'and', '', '', '', ''], strtolower(trim($url)));
    }

    private function createFolders($filePath)
    {
        $parts = explode('/', $filePath);
        // skip file name
        $parts = array_slice($parts, 0, count($parts) - 1);
        $targetPath = implode('/', $parts);
        $path = realpath($targetPath);
        if (!$path) {
            mkdir($targetPath, 0777, true);
        }
    }

    private function saveThumb($filename, $type, $entity)
    {
        $path = $type == 1 ? Yii::getAlias('@imgPath/'.$entity.'/') : $filename;
        foreach (Yii::$app->params['thumbs'] as $profile => $config) {
            $thumbPath = $type == 1 ? $path.$profile.'-'.$filename : $path.$profile.'.jpg';
            if ($thumbPath !== null) {
                if (!is_file($thumbPath)) {
                    $this->generateImageThumb($config, $type == 1 ? $path.$filename : $filename.'original.jpg', $thumbPath);
                }
            }
        }
        if ($type == 2) {
            $thumbPath = $path.'preview.jpg';
            if ($thumbPath !== null) {
                if (!is_file($thumbPath)) {
                    $this->generateImageThumb(['width' => 200, 'quality' => 90], $filename.'original.jpg', $thumbPath);
                }
            }
        }
    }

    private function generateImageThumb($config, $path, $thumbPath)
    {
        $width = ArrayHelper::getValue($config, 'width');
        $height = ArrayHelper::getValue($config, 'height');
        $quality = ArrayHelper::getValue($config, 'quality', 100);
        $mode = ArrayHelper::getValue($config, 'mode', ManipulatorInterface::THUMBNAIL_INSET);

        if (!$width || !$height) {
            $image = Image::getImagine()->open($path);
            $ratio = $image->getSize()->getWidth() / $image->getSize()->getHeight();
            if ($width) {
                $height = ceil($width / $ratio);
            } else {
                $width = ceil($height * $ratio);
            }
        }

        // Fix error "PHP GD Allowed memory size exhausted".
        ini_set('memory_limit', '1024M');
        Image::thumbnail($path, $width, $height, $mode)->save($thumbPath, ['quality' => $quality]);
    }

    private function translate($name)
    {
        $arr = [
            'Wood' => 'Дерево',
            'Steel' => 'Сталь',
            'Glass Reinforced Plastic' => 'Стеклопластик',
            'Ironwood' => 'Твердое дерево',
            'Aluminium' => 'Алюминий',
            'English' => 'Английский',
            'German' => 'Немецкий',
            'French' => 'Французский',
            'Russian' => 'Русский',
            'Ukrainian' => 'Украинский',
            'Other' => 'Другие',
            'Radar' => 'Радар',
            'Radio VHF/DSC/SSB' => 'Радиосвязь',
            'Fire Alarm & Fire Extinguishers' => 'Пожарная сигнализация и система пожаротушения',
            'Depth Sounder' => 'Эхолот',
            'Bilge Pump Alarm' => 'Помпа',
            'EPIRB' => 'EPIRB',
            'Crew Trained in CPR' => 'Команда тренированная по CPR',
            'Crew Trained in First Aid' => 'Команда тренированная по оказанию первой помощи',
            'Fishfinder' => 'Ультразвуковой сонар',
            'Emergency Rafts' => 'Спасательные плоты',
            'Oxygen' => 'Кислород',
            'Sounder' => 'Сирена',
            'Search Light' => 'Поисковый прожектор',
            'GPS' => 'GPS',
            'Life Vests' => 'Спасательные жилеты',
            'First Aid Kits' => 'Аптечки первой помощи',
            'Satellite & Mobile Phones' => 'Спутниковая и сотовая связь',
            'Engine Room CCTV' => 'Система видеонаблюдения в машинном отделении',
            'Emergency Flares' => 'Аварийные факелы',
            'Western Food' => 'Западная кухня',
            'Local Food' => 'Местная кухня',
            'Vegetarian Options' => 'Вегетарианская кухня',
            'Buffet Style' => 'Шведский стол',
            'Beer Available' => 'Пиво',
            'Selection of Wines' => 'Вина',
            'Fine Cuisine' => 'Высокая кухня',
            'Hot and Cold Beverages' => 'Горячие-холодные напитки',
            'Snacks All Day' => 'Закуски в течение дня',
            'Ice Making Machine' => 'Мороженница',
            'Child Friendly' => 'Подходит для детей',
            'Non-Diver (Snorkeler) Friendly' => 'Подходит для не-дайверов',
            'Air Conditioned Saloon' => 'Кондиционирование салона',
            'Air Conditioned Cabins' => 'Кондиционирование в каютах',
            'Double Cabins' => 'Двухместные кровати',
            'Open Air Saloon' => 'Салон на открытом воздухе',
            'Bar' => 'Бар',
            'Sun Deck' => 'Сан дек',
            'Pool on deck' => 'Бассейн на сан деке',
            'Sauna' => 'Сауна',
            'Hot Tub' => 'Джакузи',
            'Library' => 'Библиотека',
            'TV in Cabins' => 'ТВ в каютах',
            'Charging Stations' => 'Зарядные станции',
            'PC for Shared Use' => 'Компьютер',
            'Warm Water Showers' => 'Душ с теплой водой',
            'Massage' => 'Массаж',
            'Daily Housekeeping' => 'Ежедневная уборка',
            'Laundry Service' => 'Прачечная',
            'Spacious Dive Deck' => 'Просторный дайв-дек',
            'Onboard Kayaks' => 'Каяки',
            'Separate Rinse for U/W Camera' => 'Специальное хранилище для фототехники',
            'Camera & Photography Station' => 'Оборудована для фотографов',
            'Yoke Tanks' => 'баллоны Yoke',
            'DIN Tanks' => 'баллоны DIN',
            'Rebreather Support' => 'Поддержка ребризеров',
            'Compressors' => 'Компрессоры',
            'Tech Diving' => 'Технический дайвинг',
            'Dive Deck' => 'Дайв-дек',
            'Passport' => 'Паспорт',
            'Certification Card' => 'Дайвинг-сертификат',
            'Date of birth' => 'Дата рождения',
            'Date of last dive' => 'Дата последнего дайва',
            'Logbook' => 'Логбук',
            'Diving Insurance' => 'Дайверская страховка',
            'Number of logged dives' => 'Количество дайвов в логбуке'
        ];
        return isset($arr[$name]) ? $arr[$name] : $name;
    }

    private function getBoatId($slug)
    {
        $replace = array(
            's-echo' => 'c-echo-ii',
            'c-echo-i' => 'c-echo-ii',
            'golden-dolphin' => 'golden-dolphin-i',
            'dive-race-2' => 'diverace-class-e-thailand-burma',
            'tropic-dancer' => 'rock-islands-aggressor-tropic-dancer',
            'okeanos-agressor-i' => 'okeanos-aggressor-i',
            'okeanos-aggressor-ii' => 'okeanos-aggressor-ii-wind-dancer',
            'belize-aggressor-iv' => 'belize-aggressor-iv-sun-dancer-ii',
            'indo-aggressor' => 'indo-aggressor-komodo-dancer',
            'palau-aggressor' => 'palau-aggressor-ii',
            'mv-emperor-leo' => 'emperor-leo',
            'my-seawolf-soul' => 'seawolf-soul',
            'my-seawolf-dominator' => 'seawolf-dominator',
            'my-seawolf-felo' => 'seawolf-felo',
            'turks-and-caicos-explorer-ii-2' => 'turks-and-caicos-explorer-ii',
            'fiji-aggressor' => 'fiji-aggressor-fiji-island-dancer-ii',
            'philippines-siren' => 'philippine-siren',
            'princesse-haleema' => 'princess-haleema',
            'snefro-target-2' => 'snefro-target',
            'solitude-one-2' => 'solitude-one',
            'fun-azul' => 'fun-azul-maldives',
            'dive-race' => 'diverace-class-e-thailand-burma',
            'undersea-hunter' => 'nautilus-under-sea',
            'blue-force-one' => 'blue-force-i',
            'azores' => 'atlantis-azores'
        );
        $slug = isset($replace[$slug]) ? $replace[$slug] : $slug;
        if (!self::$boats) {
            self::$boats = Yii::$app->db->createCommand('SELECT id, seoUrl FROM {{%entity}} WHERE type = 1;')->queryAll();
        }

        foreach (self::$boats as $b) {
            $boats[$b['seoUrl']] = $b['id'];
        }

        return isset($boats[$slug]) ? $boats[$slug] : null;
    }

    private function getCountryId($slug)
    {
        $replace = array(
            'country_croatia' => 'croatia',
            'malaisia' => 'malaysia',
            'sri_lanka' => 'sri-lanka',
            'tailand' => 'thailand',
            'kuba' => 'cuba',
            'gavajskie-ostrova' => 'hawaii',
            'marshallovy-ostrova' => 'marshall-islands',
            'shotlandiya' => 'scotland',
            'fidzhi' => 'fiji',
            'beliz' => 'belize',
            'turciya' => 'turkey',
            'terks-i-kajkos' => 'turks-and-caicos',
            'ispaniya' => 'spain',
            'tanzaniya' => 'tanzania',
            'kipr' => '',
        );
        $slug = isset($replace[$slug]) ? $replace[$slug] : $slug;
        if (!self::$countries) {
            self::$countries = Yii::$app->db->createCommand('SELECT id, url FROM {{%country}};')->queryAll();
        }

        foreach (self::$countries as $c) {
            $countries[$c['url']] = $c['id'];
        }

        return isset($countries[$slug]) ? $countries[$slug] : null;
    }
}