#!/usr/bin/env php
<?php

declare(strict_types=1);

use Adawolfa\RUIAN\Address\Coordinates;
use Adawolfa\RUIAN\AddressWGS84;
use Adawolfa\RUIAN\DatabaseFactory;
use Adawolfa\RUIAN\Reader;
use JTSK\Converter;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;

require(__DIR__ . '/vendor/autoload_runtime.php');

return function (Command $command): Command {

	$command->addArgument(
		name: 'result',
		mode: InputArgument::REQUIRED,
		description: 'Output file name.',
	);

	$command->addOption(
		name:        'source',
		shortcut:    's',
		mode:        InputOption::VALUE_REQUIRED,
		description: 'CSV source file',
		default:     sprintf(
			'https://vdp.cuzk.cz/vymenny_format/csv/%s_OB_ADR_csv.zip',
			date_create('last day of last month')->format('Ymd'),
		),
	);

	$command->setCode(function (InputInterface $input): int {

		$reader = Reader::open($input->getOption('source'));
		$database = DatabaseFactory::create();

		$converter = new Converter;

		foreach ($reader->read() as $address) {

			$wgs84 = null;

			if ($address->jtskCoordinates !== null) {

				[$x, $y] = array_values($converter->JTSKtoWGS84(
					$address->jtskCoordinates->x,
					$address->jtskCoordinates->y,
				));

				$wgs84 = new Coordinates((string) $x, (string) $y);

			}

			$database->push(new AddressWGS84($address, $wgs84));

		}

		$database->write($input->getArgument('result'));

		return 0;

	});

	return $command;

};