package database

import (
	"database/sql/driver"
	"fmt"
)

// GeographyPoint представляет PostGIS GEOGRAPHY(POINT) в WGS84
// Для Sprint 1 мы используем ST_X() и ST_Y() в SELECT запросах,
// поэтому этот тип используется только для INSERT операций
type GeographyPoint struct {
	Longitude float64
	Latitude  float64
	Valid     bool
}

func (g *GeographyPoint) Scan(value interface{}) error {
	if value == nil {
		g.Valid = false
		return nil
	}
	// В Sprint 1 мы не используем Scan, так как извлекаем координаты через ST_X/ST_Y
	// Для production: использовать github.com/twpayne/go-geom для полноценного парсинга
	return fmt.Errorf("GeographyPoint.Scan not implemented - use ST_X/ST_Y in queries")
}

// Value реализует driver.Valuer для использования в INSERT/UPDATE запросах
func (g GeographyPoint) Value() (driver.Value, error) {
	if !g.Valid {
		return nil, nil
	}
	// Возвращаем WKT формат с SRID для PostGIS
	return fmt.Sprintf("SRID=4326;POINT(%f %f)", g.Longitude, g.Latitude), nil
}

// NewGeographyPoint создает новую точку с координатами
func NewGeographyPoint(lon, lat float64) *GeographyPoint {
	return &GeographyPoint{
		Longitude: lon,
		Latitude:  lat,
		Valid:     true,
	}
}
