<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2401041621v2 extends AbstractMigration
{
    private function gerarCentroides(array $registros): void
    {
        foreach ($registros as $registro) {
            $rowCentroide = $this->calculaCentroide($registro['ds_coordenadas']) ?? '';
            $rowCentroide = "'{$rowCentroide}'";

            $this->execute(<<<SQL
                UPDATE seguro.propostas_croquis_talhoes SET ds_coordenadas_centroide = {$rowCentroide} WHERE id = {$registro['id']}
SQL
);
        }
    }

    private function calculaCentroide(string $coordenadas): ?string
    {
        $coordenadasGerarCentroide = [];
        $jsonCoordenadas = json_decode($coordenadas, true);

        $totalCoordenadas = count($jsonCoordenadas);
        $hasApenasUmaCoordenada = $totalCoordenadas == 1;

        if (!$hasApenasUmaCoordenada && $totalCoordenadas < 3) {
            return null;
        }

        foreach ($jsonCoordenadas as $coordenadas) {
            $coordenadasGerarCentroide[] = "{$coordenadas['latitude']} {$coordenadas['longitude']}";
        }

        if ($hasApenasUmaCoordenada) {
            return $coordenadasGerarCentroide[0];
        }

        if (trim($coordenadasGerarCentroide[0]) !== trim(end($coordenadasGerarCentroide))) {
            $coordenadasGerarCentroide[] = "{$jsonCoordenadas[0]['latitude']} {$jsonCoordenadas[0]['longitude']}";
        }

        $rowCentroide = $this->fetchRow("SELECT ST_AsText(ST_PointOnSurface('POLYGON((" . implode(',', $coordenadasGerarCentroide) . "))'::geometry)) as coordenadas");
        $rowCentroide = implode(', ', explode(' ', trim(str_replace(')', '', str_replace('POINT(', '', $rowCentroide['coordenadas'])))));

        return $rowCentroide;
    }

    /**
     * Se o item tiver polígono no endosso vigente, colocar a coordenada do centroide deste polígono, tal como está sendo feito no momento do croqui;
     */
    private function preencherCentroides(): void
    {
        $rs = $this->fetchAll("
            SELECT 
                spct.id,
                spct.ds_coordenadas
            FROM 
                seguro.propostas_croquis_talhoes spct
            INNER JOIN seguro.propostas_croquis spc
                ON spc.id = spct.id_croqui
            INNER JOIN seguro.propostas sp 
                ON sp.id = spc.id_proposta
            INNER JOIN produto.produtos pp
                ON pp.id = sp.id_produto
            WHERE 
                (spct.ds_coordenadas <> '' OR spct.ds_coordenadas IS NOT NULL)
                AND (spct.ds_coordenadas_centroide = '' OR spct.ds_coordenadas_centroide IS NULL)
                AND pp.id_safra >= 22
        ");

        $this->gerarCentroides($rs);
    }

    public function up(): void
    {
        $this->preencherCentroides();
    }

    public function down(): void
    {

    }
}
