from matplotlib import pyplot as plt
from matplotlib.path import Path
from matplotlib.patches import PathPatch

import numpy
import geopandas as gpd
from shapely.wkt import loads
from shapely import Point, Polygon
import cartagen as c4

lines = [
    loads('LINESTRING (-188576.50116454227827489 5357038.11717060580849648, -188568.81977856467710808 5357058.24138782359659672, -188562.01184532378101721 5357079.04958384297788143, -188555.70302793246810324 5357100.24862489476799965, -188549.5189895035000518 5357121.54537720233201981, -188543.08539314975496382 5357142.64670699369162321, -188536.02790198411094025 5357163.25948049873113632, -188527.97217911930056289 5357183.09056394174695015, -188518.54388766823103651 5357201.84682355262339115, -188507.36869074372225441 5357219.23512555658817291, -188494.07225145856500603 5357234.96233617886900902, -188476.57934188813669607 5357251.0307760126888752, -188456.14319089212222025 5357266.69844977185130119, -188433.38756187079707161 5357281.63780568260699511, -188408.93621822423301637 5357295.52129196561872959, -188383.41292335261823609 5357308.0213568489998579, -188357.44144065617001615 5357318.81044855620712042, -188331.64553353504743427 5357327.56101531069725752, -188306.64896538946777582 5357333.94550533778965473, -188283.07549961950280704 5357337.63636686000972986, -188261.54889962539891712 5357338.30604810453951359, -188245.61580801362288184 5357335.7480606883764267, -188230.46766633220249787 5357330.07718733325600624, -188215.93322458767215721 5357321.99727062415331602, -188201.84123278659535572 5357312.21215315442532301, -188188.02044093539007008 5357301.42567750997841358, -188174.29959904070710763 5357290.34168628230690956, -188160.50745710905175656 5357279.66402205917984247, -188146.47276514698751271 5357270.09652742929756641, -188132.02427316099056043 5357262.34304498229175806, -188116.99073115768260323 5357257.10741730593144894, -188101.1217681551061105 5357253.67263043485581875, -188084.05978312451043166 5357250.80733799003064632, -188066.23920401325449347 5357248.63034739159047604, -188048.09445876890094951 5357247.26046604849398136, -188030.05997533857589588 5357246.81650137528777122)'),
    loads('LINESTRING (-188030.05997533857589588 5357246.81650137528777122, -188012.57018166987108998 5357247.41726079024374485, -187996.05950571005814709 5357249.18155170511454344, -187980.96237540661240928 5357252.22818153258413076, -187967.71321870695101097 5357256.67595768999308348, -187956.74646355837467127 5357262.64368759002536535, -187949.84877067938214168 5357269.51456126291304827, -187944.18133839030633681 5357279.00279429368674755, -187939.55005613854154944 5357290.31297818943858147, -187935.76081337183131836 5357302.64970446564257145, -187932.61949953739531338 5357315.21756462939083576, -187929.93200408288976178 5357327.22115019336342812, -187927.50421645576716401 5357337.86505266837775707, -187925.14202610345091671 5357346.35386356618255377, -187922.65132247353903949 5357351.89217439573258162, -187919.83799501342582516 5357353.6845766669139266, -187915.99913517676759511 5357348.15063739009201527, -187912.76486279122764245 5357333.95104226935654879, -187909.98230609204620123 5357313.25872099213302135, -187907.49859331449260935 5357288.24660325609147549, -187905.16085269383620471 5357261.08761875052005053, -187902.81621246528811753 5357233.95469716936349869, -187900.31180086408858187 5357209.02076820470392704, -187897.49474612562335096 5357188.45876155234873295, -187894.21217648495803587 5357174.44160690065473318, -187890.31122017747838981 5357169.14223394263535738, -187884.59828180525801145 5357176.47255875170230865, -187877.98959533451125026 5357196.8191042710095644, -187870.70250806221156381 5357226.92494015116244555, -187862.95436728530330583 5357263.53313604556024075, -187854.96252030081814155 5357303.38676159828901291, -187846.94431440558400936 5357343.22888646461069584, -187839.1170968966325745 5357379.80258029047399759, -187831.69821507099550217 5357409.85091272927820683, -187824.90501622552983463 5357430.11695342697203159, -187818.95484765723813325 5357437.34377203602343798, -187813.60922283757827245 5357428.02456559427082539, -187809.21631924007670023 5357403.43118345737457275, -187805.53625986544648185 5357367.38192572630941868, -187802.3291677144006826 5357323.69509249925613403, -187799.3551657876232639 5357276.18898387998342514, -187796.37437708582729101 5357228.68189996760338545, -187793.14692460975493304 5357184.99214086309075356, -187789.43293136003194377 5357148.93800666742026806, -187784.99252033742959611 5357124.33779748436063528, -187779.58581454263185151 5357115.00981341022998095, -187773.42632903894991614 5357122.43167085945606232, -187766.31036396863055415 5357143.25199209526181221, -187758.49474848533282056 5357174.1243920074775815, -187750.23631174286128953 5357211.70248548872768879, -187741.7918828948168084 5357252.6398874269798398, -187733.418291095062159 5357293.59021271672099829, -187725.37236549725639634 5357331.20707624964416027, -187717.91093525517499074 5357362.14409291557967663, -187711.2908295223605819 5357383.05487760528922081, -187705.76887745273415931 5357390.59304521232843399, -187703.10938356330734678 5357387.34919028542935848, -187701.77801509614801034 5357378.72513846307992935, -187701.31380716597777791 5357365.81951195001602173, -187701.25579488746006973 5357349.73093295097351074, -187701.14301337534561753 5357331.55802366882562637, -187700.51449774432694539 5357312.39940630830824375, -187698.90928310918388888 5357293.35370307415723801, -187695.86640458455076441 5357275.51953617110848427, -187690.92489728520740755 5357259.99552780203521252, -187683.62379632575903088 5357247.88030017167329788, -187671.31301837824867107 5357236.17118908185511827, -187655.22293168070609681 5357224.84481241181492805, -187636.21524982279515825 5357214.23616491723805666, -187615.15168639470357448 5357204.68024136126041412, -187592.89395498629892245 5357196.51203650794923306, -187570.30376918776892126 5357190.06654511205852032, -187548.24284258886473253 5357185.67876193951815367, -187527.57288877971586771 5357183.68368174880743027)'),
    loads('LINESTRING (-187527.57288877971586771 5357183.68368174880743027, -187509.15562135027721524 5357184.41629929933696985, -187493.85275389050366357 5357188.21160935517400503, -187483.05543300090357661 5357195.67145638167858124, -187474.41412154273712076 5357207.56374913267791271, -187467.38444687289302237 5357222.77343471348285675, -187461.42203634817269631 5357240.18546023033559322, -187455.98251732537755743 5357258.68477278668433428, -187450.52151716145453975 5357277.15631948783993721, -187444.4946632131759543 5357294.48504743725061417, -187437.35758283743052743 5357309.55590374022722244, -187428.56590339110698551 5357321.25383550114929676, -187417.57525223094853573 5357328.46378982625901699, -187401.76577611034736037 5357330.71160441357642412, -187383.77284723217599094 5357327.36438927613198757, -187363.96931211568880826 5357319.67681212723255157, -187342.72801728011108935 5357308.90354067925363779, -187320.42180924455169588 5357296.29924264457076788, -187297.42353452829411253 5357283.1185857355594635, -187274.10603965050540864 5357270.61623766273260117, -187250.84217113038175739 5357260.04686614219099283, -187228.00477548711933196 5357252.66513888258486986, -187205.96669923991430551 5357249.72572359722107649, -187183.85556180623825639 5357251.3313650032505393, -187161.58778502585482784 5357256.26505106501281261, -187139.19877530791563913 5357263.78060743398964405, -187116.72393906160141341 5357273.13185976259410381, -187094.19868269603466615 5357283.57263369858264923, -187071.65841262036701664 5357294.35675489343702793, -187049.13853524386649951 5357304.73804899491369724, -187026.67445697559742257 5357313.97034165635704994, -187004.3015842247987166 5357321.30745852831751108, -186982.05532340056379326 5357326.00322525668889284, -186961.4786176317720674 5357328.17059058137238026, -186940.96656216646078974 5357329.01506579294800758, -186920.5077481274784077 5357328.77010208740830421, -186900.09076663784799166 5357327.66915066167712212, -186879.70420882035978138 5357325.94566271081566811, -186859.33666579803684726 5357323.83308943267911673, -186838.9767286938149482 5357321.56488202512264252, -186818.61298863048432395 5357319.37449168134480715, -186798.23403673115535639 5357317.49536960106343031, -186777.82846411853097379 5357316.16096697747707367)')
]

line1 = c4.accordion(lines[1], 50, 1, sigma=15)
line1 = c4.smooth_gaussian(line1, 10, 5)

gdf = gpd.GeoDataFrame(geometry=lines, crs=3857)
prop = c4.propagation_network(lines, 1, line1)

fig = plt.figure(1, (12, 12))

sub1 = fig.add_subplot(311)
sub1.set_aspect('equal')
sub1.set_title('3 lines')
sub1.axes.get_xaxis().set_visible(False)
sub1.axes.get_yaxis().set_visible(False)

sub2 = fig.add_subplot(312)
sub2.set_aspect('equal')
sub2.set_title('Apply accordion to the middle section')
sub2.axes.get_xaxis().set_visible(False)
sub2.axes.get_yaxis().set_visible(False)

sub3 = fig.add_subplot(313)
sub3.set_aspect('equal')
sub3.set_title('Replace the middle section and propagate the change')
sub3.axes.get_xaxis().set_visible(False)
sub3.axes.get_yaxis().set_visible(False)

############################
path = Path(numpy.asarray(lines[0].coords)[:, :2])
sub1.add_patch(PathPatch(path, facecolor="none", edgecolor='navy', linewidth=1))

path = Path(numpy.asarray(lines[1].coords)[:, :2])
sub1.add_patch(PathPatch(path, facecolor="none", edgecolor='red', linewidth=1))

path = Path(numpy.asarray(lines[2].coords)[:, :2])
sub1.add_patch(PathPatch(path, facecolor="none", edgecolor='navy', linewidth=1))

############################
path = Path(numpy.asarray(lines[0].coords)[:, :2])
sub2.add_patch(PathPatch(path, facecolor="none", edgecolor='navy', linewidth=1))

path = Path(numpy.asarray(line1.coords)[:, :2])
sub2.add_patch(PathPatch(path, facecolor="none", edgecolor='red', linewidth=1))

path = Path(numpy.asarray(lines[2].coords)[:, :2])
sub2.add_patch(PathPatch(path, facecolor="none", edgecolor='navy', linewidth=1))

############################
path = Path(numpy.asarray(prop[0].coords)[:, :2])
sub3.add_patch(PathPatch(path, facecolor="none", edgecolor='navy', linewidth=1))

path = Path(numpy.asarray(prop[1].coords)[:, :2])
sub3.add_patch(PathPatch(path, facecolor="none", edgecolor='red', linewidth=1))

path = Path(numpy.asarray(prop[2].coords)[:, :2])
sub3.add_patch(PathPatch(path, facecolor="none", edgecolor='navy', linewidth=1))

############################
sub1.autoscale_view()
sub2.autoscale_view()
sub3.autoscale_view()
plt.show()