# Implementation of module {simple_greedy_path}.
# Last edited on 2021-05-17 12:48:34 by jstolfi

import simple_greedy_path
import path
import block
import contact
import contact_hp
import rn

def make(wr, o, BCS, CTS, mp_jump):
  Q = path.make_empty(o)
  Q_maxtc = 0
  CTS_R = CTS

  def opdist(bcp):
    bc, ip = bcp
    oph = block.choice(bc, ip)
    d = rn.dist(o, path.pini(oph))
    return d
  
  def find_contact():
    for ct in CTS:
      if contact_hp.side_block(ct, 0) == bc_prev and contact_hp.side_block(ct, 1) == bc:
        return ct
      elif contact_hp.side_block(ct, 0) == bc and contact_hp.side_block(ct, 1) == bc_prev:
        return ct
    return None

  def find_raster_link():
    ct = find_contact()
    rasterLink = None

    if ct != None and contact_hp.get_raster_links(ct) != [None, None]:
      qEnd = path.pfin(Q)
      pIni = path.pini(P)
      links = contact_hp.get_raster_links(ct)

      if links[0] != None:
        p0 = path.pini(links[0])
        q0 = path.pfin(links[0])

        if qEnd == p0 and pIni == q0:
          rasterLink = links[0]
        
        elif qEnd == q0 and pIni == p0:
          rasterLink = path.rev(links[0])       

      if links[1] != None:
        p1 = path.pini(links[1])
        q1 = path.pfin(links[1])

        if qEnd == p1 and pIni == q1:
          rasterLink = links[1]
        
        elif qEnd == q1 and pIni == p1:
          rasterLink = path.rev(links[1])    

    return rasterLink

  bc_prev = None

  while len(BCS) > 0:
    BCC = []

    for bc in BCS:
      np = block.nchoices(bc)
      for ip in range(np):
        bcp = (bc, ip)
        BCC.append(bcp)
    
    BCC.sort(key = opdist)
    bc, ip = BCC[0]
    P = block.choice(bc, ip)
    rasterLink = find_raster_link()

    if rasterLink != None:
      Q = path.concat((Q, rasterLink), True, True, mp_jump)
      
    Q = path.concat((Q, P), True, True, mp_jump) 
    Q_maxtc = max(Q_maxtc, contact.max_tcool(Q, CTS))

    BCS = remove_block(BCS, bc)
    CTS_R = remove_contacts(CTS_R)
    o = path.pfin(Q)
  
  generic_path.describe_solution(wr, Q, CTS, +inf, o, o, 0)
  return Q
  # ----------------------------------------------------------------------
  

