"""
Tests for functions to maintain the artificial postcode table.
"""

import pytest

from nominatim.tools import postcodes
import dummy_tokenizer

@pytest.fixture
def tokenizer():
    return dummy_tokenizer.DummyTokenizer(None, None)

@pytest.fixture
def postcode_table(temp_db_with_extensions, temp_db_cursor, table_factory,
                   placex_table, word_table):
    table_factory('location_postcode',
                  """ place_id BIGINT,
                      parent_place_id BIGINT,
                      rank_search SMALLINT,
                      rank_address SMALLINT,
                      indexed_status SMALLINT,
                      indexed_date TIMESTAMP,
                      country_code varchar(2),
                      postcode TEXT,
                      geometry GEOMETRY(Geometry, 4326)""")
    temp_db_cursor.execute('CREATE SEQUENCE seq_place')
    temp_db_cursor.execute("""CREATE OR REPLACE FUNCTION token_normalized_postcode(postcode TEXT)
                              RETURNS TEXT AS $$ BEGIN RETURN postcode; END; $$ LANGUAGE plpgsql;
                           """)


def test_import_postcodes_empty(dsn, temp_db_cursor, postcode_table, tmp_path, tokenizer):
    postcodes.import_postcodes(dsn, tmp_path, tokenizer)

    assert temp_db_cursor.table_exists('gb_postcode')
    assert temp_db_cursor.table_exists('us_postcode')
    assert temp_db_cursor.table_rows('location_postcode') == 0


def test_import_postcodes_from_placex(dsn, temp_db_cursor, postcode_table, tmp_path, tokenizer):
    temp_db_cursor.execute("""
        INSERT INTO placex (place_id, country_code, address, geometry)
          VALUES (1, 'xx', '"postcode"=>"9486"', 'SRID=4326;POINT(10 12)')
    """)

    postcodes.import_postcodes(dsn, tmp_path, tokenizer)

    rows = temp_db_cursor.row_set(""" SELECT postcode, country_code,
                                      ST_X(geometry), ST_Y(geometry)
                                      FROM location_postcode""")
    print(rows)
    assert len(rows) == 1
    assert rows == set((('9486', 'xx', 10, 12), ))

