<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Schema;

class ImportFishLandGeojson extends Command
{
    protected $signature = 'fish:import-land-geojson
                            {path : Kara/darı kara poligon GeoJSON dosyası (FeatureCollection)}
                            {--source=import : Kaynak etiketi (fish_land_polygons.source)}';

    protected $description = 'Natural Earth veya OSM kıyısından türetilmiş kara poligonlarını PostGIS\'e yükler.';

    public function handle(): int
    {
        if (Schema::getConnection()->getDriverName() !== 'pgsql') {
            $this->error('Bu komut yalnızca PostgreSQL + PostGIS gerektirir.');

            return self::FAILURE;
        }

        if (! Schema::hasTable('fish_land_polygons')) {
            $this->error('fish_land_polygons tablosu yok — migration çalıştırın.');

            return self::FAILURE;
        }

        $path = $this->argument('path');
        if (! File::isReadable($path)) {
            $this->error("Dosya okunamıyor: {$path}");

            return self::FAILURE;
        }

        $decoded = json_decode(File::get($path), true);
        if (! is_array($decoded) || ($decoded['type'] ?? '') !== 'FeatureCollection') {
            $this->error('GeoJSON FeatureCollection bekleniyor.');

            return self::FAILURE;
        }

        $source = (string) $this->option('source');
        $inserted = 0;

        DB::transaction(function () use ($decoded, $source, &$inserted) {
            foreach ($decoded['features'] ?? [] as $feature) {
                $geom = $feature['geometry'] ?? null;
                if (! is_array($geom)) {
                    continue;
                }

                $type = $geom['type'] ?? '';
                if (! in_array($type, ['Polygon', 'MultiPolygon'], true)) {
                    continue;
                }

                $gj = json_encode($geom);
                DB::insert(
                    'INSERT INTO fish_land_polygons (source, geom, created_at, updated_at)
                     VALUES (?, ST_Multi(ST_MakeValid(ST_SetSRID(ST_GeomFromGeoJSON(?), 4326))), ?, ?)',
                    [$source, $gj, now(), now()]
                );
                $inserted++;
            }
        });

        $this->info("Tamamlandı: {$inserted} poligon eklendi (source={$source}).");

        return self::SUCCESS;
    }
}
