<?php

namespace Shm\ShmIntegrations;

use Shm\Shm;
use Shm\ShmRPC\ShmRPC;

class Travelpayouts
{



    public static function rpcAvia()
    {

        return [

            'travelAutocomplete' => ShmRPC::lazy(function () {
                return [
                    'type' => Shm::listOf(
                        Shm::structure([
                            'id' => Shm::string()->title('UUID записи'),
                            'code' => Shm::string()->title('IATA-код города/аэропорта'),
                            'name' => Shm::string()->title('Название'),
                            'type' => Shm::string()->title('Тип объекта (city/airport/country)'),
                            'country_code' => Shm::string()->title('IATA-код страны'),
                            'country_name' => Shm::string()->title('Название страны'),
                            'state_code' => Shm::string()->title('Код штата'),
                            'coordinates' => Shm::structure([
                                'lon' => Shm::float()->title('Долгота'),
                                'lat' => Shm::float()->title('Широта'),
                            ])->title('Координаты'),
                            'index_strings' => Shm::listOf(Shm::string())->title('Варианты запросов'),
                            'weight' => Shm::int()->title('Вес для сортировки'),
                            'cases' => Shm::structure([
                                'vi' => Shm::string()->title('Винительный падеж'),
                                'tv' => Shm::string()->title('Творительный падеж'),
                                'su' => Shm::string()->title('Именительный падеж'),
                                'ro' => Shm::string()->title('Родительный падеж'),
                                'pr' => Shm::string()->title('Предложный падеж'),
                                'da' => Shm::string()->title('Дательный падеж'),
                            ])->title('Падежи названия города'),
                            'country_cases' => Shm::structure([
                                'vi' => Shm::string()->title('Винительный падеж'),
                                'tv' => Shm::string()->title('Творительный падеж'),
                                'su' => Shm::string()->title('Именительный падеж'),
                                'ro' => Shm::string()->title('Родительный падеж'),
                                'pr' => Shm::string()->title('Предложный падеж'),
                                'da' => Shm::string()->title('Дательный падеж'),
                            ])->title('Падежи названия страны'),
                            'main_airport_name' => Shm::string()->title('Название аэропорта'),
                        ])
                    )->title('Результаты автокомплита'),
                    'args' => [
                        'term' => Shm::nonNull(Shm::string())->title('Текст для поиска'),
                        'locale' => Shm::string()->title('Язык вывода')->default('ru'),
                        'types' => Shm::listOf(Shm::string())->title('Типы для поиска (city, airport, country)')->default(['city', 'airport']),
                    ],
                    'resolve' => function ($root, $args) {
                        $term = $args['term'] ?? '';
                        $locale = $args['locale'] ?? 'ru';
                        $types = $args['types'] ?? ['city', 'airport'];

                        if (empty($term)) {
                            return [];
                        }

                        $queryParts = [];
                        $queryParts[] = 'term=' . urlencode($term);
                        $queryParts[] = 'locale=' . urlencode($locale);
                        foreach ($types as $type) {
                            $queryParts[] = 'types[]=' . urlencode($type);
                        }

                        $url = 'https://autocomplete.travelpayouts.com/places2?' . implode('&', $queryParts);

                        try {
                            $context = stream_context_create([
                                'http' => [
                                    'timeout' => 5,
                                    'ignore_errors' => true
                                ]
                            ]);

                            $jsonString = @file_get_contents($url, false, $context);

                            if ($jsonString === false) {
                                return [];
                            }

                            $data = json_decode($jsonString, true);

                            if (!is_array($data)) {
                                return [];
                            }

                            return $data;
                        } catch (\Exception $e) {
                            return [];
                        }
                    }
                ];
            }),


        ];
    }
}