<?php 
 
declare(strict_types=1); 
 
namespace Slivki\Doctrine\Type; 
 
use Doctrine\DBAL\Platforms\AbstractPlatform; 
use GeoIO\Geometry\Extractor; 
use GeoIO\Geometry\Factory; 
use GeoIO\WKT\Generator\Generator; 
use GeoIO\WKT\Parser\Parser; 
use Jsor\Doctrine\PostGIS\Types\GeometryType as BaseGeometryType; 
 
class GeometryType extends BaseGeometryType 
{ 
    /** 
     * @var Parser 
     */ 
    private static $parser; 
 
    /** 
     * @var Generator 
     */ 
    private static $generator; 
 
    public function convertToDatabaseValue($value, AbstractPlatform $platform): ?string 
    { 
        if ($value === null) { 
            return null; 
        } 
 
        return self::getGenerator()->generate($value); 
    } 
 
    /** 
     * @param $value 
     * @param AbstractPlatform $platform 
     * @return mixed|null 
     */ 
    public function convertToPHPValue($value, AbstractPlatform $platform) 
    { 
        try { 
            return self::getParser()->parse($value); 
        } catch (\Exception $e) { 
            return null; 
        } 
    } 
 
    private static function getParser(): Parser 
    { 
        if (!self::$parser) { 
            self::$parser = new Parser(new Factory()); 
        } 
 
        return self::$parser; 
    } 
 
    private static function getGenerator(): Generator 
    { 
        if (!self::$generator) { 
            self::$generator = new Generator( 
                new Extractor(), 
                [ 
                    'format' => Generator::FORMAT_EWKT, 
                    'emit_srid' => true, 
                ] 
            ); 
        } 
 
        return self::$generator; 
    } 
}