-- +migrate Up
-- Migration to create geographical_features table for OSM data
-- Run this after enabling PostGIS extension

-- Create geographical_features table for storing OSM geographical data
CREATE TABLE IF NOT EXISTS geographical_features (
    id TEXT PRIMARY KEY,
    name TEXT,
    feature_type VARCHAR(50) NOT NULL,

    -- PostGIS geometry column for spatial data (supports all geometry types)
    geometry GEOMETRY(GEOMETRY, 4326),

    -- OSM metadata
    osm_type VARCHAR(50),
    osm_id VARCHAR(50),

    -- Properties from OSM or other sources (stored as JSONB for flexible querying)
    properties JSONB DEFAULT '{}'::jsonb,

    -- Processing metadata
    processing_version VARCHAR(20) DEFAULT '1.0',
    quality_score DOUBLE PRECISION DEFAULT 0.0,
    source VARCHAR(100) DEFAULT 'osm',

    -- Timestamps
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

-- Create indexes for efficient querying
CREATE INDEX IF NOT EXISTS idx_geographical_features_geometry ON geographical_features USING GIST (geometry);
CREATE INDEX IF NOT EXISTS idx_geographical_features_type ON geographical_features (feature_type);
CREATE INDEX IF NOT EXISTS idx_geographical_features_osm_id ON geographical_features (osm_type, osm_id);
CREATE INDEX IF NOT EXISTS idx_geographical_features_properties ON geographical_features USING GIN (properties);
CREATE INDEX IF NOT EXISTS idx_geographical_features_created_at ON geographical_features (created_at);

-- Add check constraints
ALTER TABLE geographical_features ADD CONSTRAINT chk_geographical_features_geometry
    CHECK (geometry IS NULL OR ST_IsValid(geometry));

ALTER TABLE geographical_features ADD CONSTRAINT chk_geographical_features_quality_score
    CHECK (quality_score >= 0.0 AND quality_score <= 1.0);

-- Add comments for documentation
COMMENT ON TABLE geographical_features IS 'Geographical features imported from OpenStreetMap and other geospatial sources';
COMMENT ON COLUMN geographical_features.geometry IS 'PostGIS geometry field storing spatial data (roads, green spaces, etc.) in WGS84 (SRID 4326)';
COMMENT ON COLUMN geographical_features.properties IS 'Additional properties from the source data stored as JSONB for flexible querying';
COMMENT ON COLUMN geographical_features.quality_score IS 'Data quality score from 0.0 to 1.0 indicating reliability of the geographical data';
