<?php

namespace Medienreaktor\Career\Service;

use GuzzleHttp\Exception\ClientException;
use Medienreaktor\Career\Domain\Model\Source;
use TYPO3\CMS\Core\Http\RequestFactory;
use TYPO3\CMS\Core\SingletonInterface;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Database\Connection;

class RecruiteeService implements SingletonInterface
{
    protected const API_ENDPOINT = "https://recruit.zoho.eu/recruit/v2/JobOpenings";


    public function getJobs(array $sources): ?array
    {


        $jobs = [];
        $url = self::API_ENDPOINT;
        $jobs = $this->rawApiCall($url);

        if(!isset($jobs["data"])){
            return null;
        }

        $jobs = $jobs["data"];

        usort($jobs, function ($a, $b) {
            return $a['Posting_Title'] <=> $b['Posting_Title'];
        });


        if (!$jobs) {
            return null;
        }

        $modifiedJobs = [];

        $jobsWithSoures = $this->addSourceToJobs($jobs, $sources);
        $jobsWithMisc = $this->addMiscToJobs($jobsWithSoures);
        return $jobsWithMisc;
    }

    protected function rawApiCall(string $url): ?array
    {
        $token = $this->getAccesToken();

        /** @var RequestFactory $requestFactory */
        $requestFactory = GeneralUtility::makeInstance(RequestFactory::class);

        $additionalOptions = [
            'headers' => ['Authorization' => 'Zoho-oauthtoken ' . $token['access_token']]
        ];

        try {
            $response = $requestFactory->request($url, 'GET', $additionalOptions);

        } catch (ClientException $exception) {
            return null;
        }

        return json_decode($response->getBody()->getContents(), true);
    }

    protected function getAccesToken()
    {

        $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_career_api_token_collection');
        $statement = $queryBuilder
            ->select('*')
            ->from('tx_career_api_token_collection')
            ->addOrderBy('crdate', 'DESC')->setMaxResults(1)->executeQuery();

        if ($statement) {
            while ($row = $statement->fetch()) {
                return $row;
            }
        } else {
            return 0;
        }

    }

    public function addSourceToJobs(array $jobs, array $sources)
    {

        $jobsWithSources = [];

        foreach ($jobs as $job) {
            foreach ($sources as $source) {
                if ($job["Firma"] == $source->getCompanyName()) {
                    $job['Source'] = $source;
                    $jobsWithSources[] = $job;
                }
            }
        }

        return $jobsWithSources;
    }

    public function getJob(string $identifier): ?array
    {
        $url = self::API_ENDPOINT . '/' . $identifier;

        $job = $this->rawApiCall($url);
        return $job['data'][0] ?? null;
    }

    public function getFilter(array $jobs)
    {


        $filter = [
            "city" => [],
            "department" => [],
            "experience" => [],
//             "employmenttype" => [],
        ];

        foreach ($jobs as $job) {
            if (!empty($job["City"])) {
                $filter["city"][$job["City"]] = $job["City"];
            }
            if(!empty($job["Berufswelt"])) {
                foreach ($job["Berufswelt"] as $berufswelt){
                    $filter["department"][$berufswelt] = $berufswelt;
                }
            }
            if (!empty($job["Work_Experience"])) {
                if(isset($job["experience"])){
                    if ($job["experience"] == "entry_level" || $job["experience"] == "mid_level" || $job["experience"] == "experienced" || $job["experience"] == "senior_manager" || $job["experience"] == "manager" || $job["experience"] == "supervisor" || $job["experience"] == "executive" || $job["experience"] == "senior_executive") {
                        $job["experience"] = "Berufserfahrene";
                    }
                }


                $filter["experience"][$job["Work_Experience"]] = $job["Work_Experience"];
            }
//             if(!empty($job["employment_type"])) {
//                 $filter["employmenttype"][$job["employment_type"]] = $job["employment_type"];
//             }

        }
        return $filter;
    }

    public function addMiscToJobs(array $jobs){
        $jobsWithMisc = [];

        foreach ($jobs as $job){
            $job["weltenString"] = implode(", ",$job["Berufswelt"]);
            $jobsWithMisc[] = $job;
        }

        return $jobsWithMisc;
    }
    protected function urlparam($value): string
    {
        return rawurlencode($value);
    }

}