<?php

namespace App\Http\Controllers\Parser;

use App\Developer;
use App\Http\Controllers\Controller;
use Symfony\Component\DomCrawler\Crawler;

class DeveloperParseController extends Controller
{
    const URL = 'https://novostroyki.lun.ua';
    const DEVELOPER_LIST = "https://novostroyki.lun.ua/uk/%D0%B7%D0%B0%D0%B1%D1%83%D0%B4%D0%BE%D0%B2%D0%BD%D0%B8%D0%BA%D0%B8-%D0%BB%D1%8C%D0%B2%D0%BE%D0%B2%D0%B0";

    public function parsePage()
    {
        $link = self::DEVELOPER_LIST;
        $html = file_get_contents($link);
        $crawler = new Crawler(null, $link);
        $crawler->addHtmlContent($html, 'UTF-8');
        $pageElements = $crawler->filter('div.pagination')->children();
        $pages = $this->getPage($pageElements);

        dump('start parse');
        $developers = [];
        foreach ($pages as $page) {
            $developers [] = $this->parseDeveloperListURL($page);
        }

        dump('start write');
        $filename = 'developers.json';
        $file = fopen(public_path().'/parser/'.$filename, "w");
        fwrite($file,json_encode($developers));
        dump('ok');
    }

    public function parseDeveloperListURL($page)
    {
        $link = self::DEVELOPER_LIST . "?page=" . $page;
        $html = file_get_contents($link);

        $crawler = new Crawler(null, $link);
        $crawler->addHtmlContent($html, 'UTF-8');
        $developersElements = $crawler->filter('div.Companies-container')->children();
        $developerURLS = $this->getLinksOfDevelopers($developersElements);
        $data = [];
        foreach ($developerURLS as $key => $developerURL) {
            $data[$key] = $this->parseDeveloper($developerURL['url'], $developerURL['logo']);
        }

        return $data;
    }

    public function getPage($links)
    {
        $data = [];
        foreach ($links as $item) {
            $itemCrawler = new Crawler($item);
            $page = $itemCrawler->attr('data-page');
            $data[] = $page;
        }
        $lastArrayElement = count($data);
        if ($lastArrayElement > 2) {
            $data = array_slice($data, 1, $lastArrayElement - 2);
        }

        return $data;
    }

    public function getLinksOfDevelopers($links)
    {
        $values = [];
        foreach ($links as $item) {
            $itemCrawler = new Crawler($item);
            $url = $itemCrawler->filter('div.CompanyCard-logo > a')->attr('href');
            $logoX2 = $itemCrawler->filter('div.CompanyCard-logo > a > img')->attr('srcset');
            $explodeLogo = strlen($logoX2) > 0 ? explode(' ', $logoX2) : [];
            $logo = count($explodeLogo) > 0 ? $explodeLogo[0] : "";

            $values[] =[
                'url' => $url,
                'logo' => $logo
            ];
        }

        return $values;
    }

    public function parseDeveloper($url, $mainLogo)
    {
        set_time_limit(300);
        $link = self::URL . $url;
        $html = file_get_contents($link);
        $crawler = new Crawler(null, $link);
        $crawler->addHtmlContent($html, 'UTF-8');

        $mainDeveloperClass = "DeveloperPremium";

        $mainElement = $crawler->filter("section div.$mainDeveloperClass");
        if ($mainElement->count() == 0) {
            $mainDeveloperClass = "DeveloperBasic";
            $mainElement = $crawler->filter("section div.$mainDeveloperClass");
        }

        $name = $mainElement->filter("h1.$mainDeveloperClass-name");
        if ($name->count() > 0) {
            $name = $name->text();
        } else {
            $name = $mainElement->filter("h1.$mainDeveloperClass-title")->text();
        }

        $logo = $mainElement->filter("div.$mainDeveloperClass-logo img")->attr("src");

//        $bannerAttribute = $mainElement->attr('style');
        $bannerAttribute = $mainElement->attr('style');
        if (is_string($bannerAttribute)) {
            $explodeBannerAttribute = explode("url(", $bannerAttribute);
            if (count($explodeBannerAttribute) > 0) {
                $bannerPathNotFormated = $explodeBannerAttribute[1];
                $explodeBannerPath = explode(')', $bannerPathNotFormated);
                if (count($explodeBannerPath) > 0) {
                    $bannerPath = "https:" . $explodeBannerPath['0'];
                }
            }
        }

        $siteLinkFullLun = $mainElement->filter('a[data-analytics-click="click_external|developer|company_page_site"]');
        if ($siteLinkFullLun->count() > 0) {
            $siteLinkFullLun = $siteLinkFullLun->attr('href');
            if ($siteLinkFullLun) {
                $decodedSiteLinkURL = urldecode($siteLinkFullLun);
                $explodeLink = explode("&to=", $decodedSiteLinkURL);
                if (count($explodeLink) > 0) {
                    $linkWithLun = $explodeLink[1];
                    $siteLinkExplode = explode("?", $linkWithLun);
                    if (count($siteLinkExplode) > 0) {
                        $siteLink = $siteLinkExplode[0];
                    }
                }
            }
        }

        $facebookLink = $mainElement->filter('a[data-analytics-click="click_external|developer|company_facebook"]');
        if ($facebookLink->count() > 0) {
            $facebookLink = $facebookLink->attr('href');
        }

        $youTubeLink = $mainElement->filter('a[data-analytics-click="click_external|developer|company_youtube"]');
        if ($youTubeLink->count() > 0) {
            $youTubeLink = $youTubeLink->attr('href');
        }

        $data = [
        "name" => $this->myTrim($name),
        "siteLink" => isset($siteLink) ? $siteLink : "",
        "logo" => !empty($logo) ? "https:" . $logo : "",
        "mainLogo" => !empty($mainLogo) ? "https:" . $mainLogo : "",
        "banner" => isset($bannerPath) ? $bannerPath : "",
        "facebookLink" => is_string($facebookLink) ? $facebookLink : "",
        "youTubeLink" => is_string($youTubeLink) ? $youTubeLink : "",
        "birthday" => $this->getDeveloperBirthday($crawler),
        "rentHome" => $this->getDeveloperRentHome($crawler),
        "processBuild" => $this->getDeveloperProcessBuild($crawler)
    ];

        if ($data['birthday'] == "") {
            dump($data);
        }

        return $data;
    }

    private function getDeveloperBirthday(Crawler $crawler): string
    {
        try {
            $birthday = $crawler->filterXPath('//div[@class="DeveloperPremium-about"]/div[1]/div[1]')->text();
        } catch (\Exception $exception) {
            try {
                $birthday = $crawler->filterXPath('//div[@class="DeveloperBasic-about"]/div[1]/span[1]')->text();
            } catch (\Exception $exception) {
                $birthday = "";
            }
        }

        return $this->myTrim($birthday);
    }

    private function getDeveloperRentHome(Crawler $crawler): string
    {
        try {
            $rentHome = $crawler->filterXPath('//div[@class="DeveloperPremium-about"]/div[2]/div[1]')->text();
        } catch (\Exception $exception) {
            try {
                $rentHome = $crawler->filterXPath('//div[@class="DeveloperBasic-about"]/div[2]/span[1]')->text();
            } catch (\Exception $exception) {
                $rentHome = "";
            }
        }

        return $this->myTrim($rentHome);
    }

    private function getDeveloperProcessBuild(Crawler $crawler): string
    {
        try {
            $processBuild = $crawler->filterXPath('//div[@class="DeveloperPremium-about"]/div[3]/div[1]')->text();
        } catch (\Exception $exception) {
            try {
                $processBuild = $crawler->filterXPath('//div[@class="DeveloperBasic-about"]/div[3]/span[1]')->text();
            } catch (\Exception $exception) {
                $processBuild = "";
            }
        }

        return $this->myTrim($processBuild);
    }


    private function myTrim($str)
    {
        return trim(preg_replace('/[[:cntrl:]]/', '', $str));
    }

    private function getCode(string $str): string
    {
        return trim(preg_replace('~[^-a-z0-9_]+~u', '-', strtolower($this->transliter($str))), "-");
    }

    function transliter($string)
    {
        $converter = array(
            'а' => 'a',
            'б' => 'b',
            'в' => 'v',
            'г' => 'g',
            'д' => 'd',
            'е' => 'e',
            'ё' => 'e',
            'ж' => 'zh',
            'з' => 'z',
            'и' => 'i',
            'й' => 'y',
            'к' => 'k',
            'і' => 'i',
            'л' => 'l',
            'м' => 'm',
            'н' => 'n',
            'о' => 'o',
            'п' => 'p',
            'р' => 'r',
            'с' => 's',
            'т' => 't',
            'у' => 'u',
            'ф' => 'f',
            'х' => 'h',
            'ц' => 'c',
            'ч' => 'ch',
            'ш' => 'sh',
            'щ' => 'sch',
            'ь' => '\'',
            'ы' => 'y',
            'ъ' => '\'',
            'э' => 'e',
            'ю' => 'yu',
            'я' => 'ya',
            'А' => 'A',
            'Б' => 'B',
            'В' => 'V',
            'Г' => 'G',
            'Д' => 'D',
            'Е' => 'E',
            'Ё' => 'E',
            'Ж' => 'Zh',
            'З' => 'Z',
            'И' => 'I',
            'Й' => 'Y',
            'К' => 'K',
            'Л' => 'L',
            'М' => 'M',
            'Н' => 'N',
            'О' => 'O',
            'П' => 'P',
            'Р' => 'R',
            'С' => 'S',
            'Т' => 'T',
            'У' => 'U',
            'Ф' => 'F',
            'Х' => 'H',
            'Ц' => 'C',
            'Ч' => 'Ch',
            'Ш' => 'Sh',
            'Щ' => 'Sch',
            'Ь' => '\'',
            'Ы' => 'Y',
            'Ъ' => '\'',
            'Э' => 'E',
            'Ю' => 'Yu',
            'Я' => 'Ya',
        );

        return strtr($string, $converter);
    }
}
