create table point (
    id serial primary key,
    nom text not null,
    geom geometry(point, 4326) not null
);

create index idx_point_geom on point using gist (geom);

create table route (
  id serial primary key,
  source int,
  target int,
  cost double precision,
  reverse_cost double precision,
  geom geometry(linestring, 4326) not null
);

create index idx_route_geom on route using gist (geom);


INSERT INTO point (nom, geom) VALUES
('AA', ST_SetSRID(ST_MakePoint(-4.015716401134025, 48.74485278820124), 4326)),
('AB', ST_SetSRID(ST_MakePoint(-4.015314069791999, 48.74487047504222), 4326)),
('AC', ST_SetSRID(ST_MakePoint(-4.014884916360503, 48.744336329699905), 4326)),
('AD', ST_SetSRID(ST_MakePoint(-4.0146327887195, 48.74421252036642), 4326)),
('AE', ST_SetSRID(ST_MakePoint(-4.01295805886216, 48.744454737377325), 4326)),
('AF', ST_SetSRID(ST_MakePoint(-4.013003500194497, 48.74529707579618), 4326)),
('AG', ST_SetSRID(ST_MakePoint(-4.013866885508904, 48.745307063914076), 4326)),
('AH', ST_SetSRID(ST_MakePoint(-4.015886500302756, 48.74435152496037), 4326)),
('AI', ST_SetSRID(ST_MakePoint(-4.0169922393896265, 48.74407185159144), 4326)),
('AJ', ST_SetSRID(ST_MakePoint(-4.016706525682735, 48.74357654268962), 4326)),
('AK', ST_SetSRID(ST_MakePoint(-4.016130238694671, 48.74305994900348), 4326)),
('AL', ST_SetSRID(ST_MakePoint(-4.01268322695224, 48.74633108784164), 4326)),
('AM', ST_SetSRID(ST_MakePoint(-4.011502153774407, 48.74527636920614), 4326)),
('AN', ST_SetSRID(ST_MakePoint(-4.011299684064602, 48.7474391861085), 4326)),
('AO', ST_SetSRID(ST_MakePoint(-4.0092682382493825, 48.747176626882954), 4326)),
('AP', ST_SetSRID(ST_MakePoint(-4.016986599170676, 48.74580116975868), 4326)),
('AQ', ST_SetSRID(ST_MakePoint(-4.018177422002985, 48.74477062852221), 4326)),
('AR', ST_SetSRID(ST_MakePoint(-4.017619213917883, 48.743923429030154), 4326)),
('AS', ST_SetSRID(ST_MakePoint(-4.01778756237945, 48.74377735868944), 4326)),
('AT', ST_SetSRID(ST_MakePoint(-4.018133119765466, 48.74377151586775), 4326)),
('AU', ST_SetSRID(ST_MakePoint(-4.021500089167666, 48.74375398739865), 4326)),
('AV', ST_SetSRID(ST_MakePoint(-4.017636934769236, 48.74298272869709), 4326)),
('AW', ST_SetSRID(ST_MakePoint(-4.00982054515667, 48.74434880428204), 4326)),
('AX', ST_SetSRID(ST_MakePoint(-4.009981334301317, 48.74419288113848), 4326)),
('AY', ST_SetSRID(ST_MakePoint(-4.0070587566129525, 48.74134972191262), 4326)),
('AZ', ST_SetSRID(ST_MakePoint(-4.006265083289092, 48.74170845222292), 4326)),
('BA', ST_SetSRID(ST_MakePoint(-4.006068894377577, 48.74217891432291), 4326)),
('BB', ST_SetSRID(ST_MakePoint(-4.006826896990252, 48.74318451229527), 4326)),
('BC', ST_SetSRID(ST_MakePoint(-4.003418425059911, 48.74296605378058), 4326)),
('BD', ST_SetSRID(ST_MakePoint(-4.003359497656666, 48.74446857837965), 4326)),
('BE', ST_SetSRID(ST_MakePoint(-4.024275254166002, 48.74298397587782), 4326)),
('BF', ST_SetSRID(ST_MakePoint(-4.019140945079908, 48.742638305027356), 4326)),
('BG', ST_SetSRID(ST_MakePoint(-4.0182483929763535, 48.742208182126596), 4326));

INSERT INTO route (source, target, cost, reverse_cost, geom)
SELECT
    a.id AS source,
    b.id AS target,
    ST_Distance(a.geom::geography, b.geom::geography) AS cost,
    ST_Distance(a.geom::geography, b.geom::geography) AS reverse_cost,
    ST_MakeLine(a.geom, b.geom) AS geom
FROM point a
JOIN point b ON a.nom = 'O' and b.nom='W';
