module DPRLR.Object.Simple.Syntax.LocalizedDisplayedBridge where

open import Cubical.Foundations.Prelude hiding (Sub ; _▷_ ; fst ; snd)

open import DPRLR.Simplicial.Hom
open import DPRLR.Object.Simple.Displayed
open import DPRLR.Object.Simple.Syntax.RawModel
open import DPRLR.Object.Simple.Syntax.LocalizedSyntax
open import DPRLR.Object.Simple.Syntax.LocalizedModel
open import DPRLR.Object.Simple.Syntax.LocalizedCoherence
import DPRLR.Object.Simple.Syntax.Base as Raw

private
  variable
     ℓD₀ ℓD₁ : Level
    Γ Δ Θ Ξ : Raw.Ctx
    A B : Raw.Ty

substPathP :
  {X : Type } {P : X  Type ℓD₁}
  {x y : X} {p q : x  y} {u : P x} {v : P y}
   p  q
   PathP  i  P (p i)) u v
   PathP  i  P (q i)) u v
substPathP {P = P} {u = u} {v = v} e =
  subst  q  PathP  i  P (q i)) u v) e

homP-subst :
  {X : Type } {P : X  Type ℓD₁}
  {x y : X} {h k : x  y} {u : P x} {v : P y}
   h  k
   P  u ≤[ h ] v
   P  u ≤[ k ] v
homP-subst {P = P} {u = u} {v = v} e =
  subst  h  P  u ≤[ h ] v) e

homP-η :
  {P : Tmᴾ Γ A  Type ℓD₁}
  {M N : Raw.Tm Γ A}
  (h : M  N)
  {M∙ : P (ηTmᴾ M)} {N∙ : P (ηTmᴾ N)}
   P  M∙ ≤[ hom-map ηTmᴾ h ] N∙
    M  P (ηTmᴾ M))  M∙ ≤[ h ] N∙
homP-η h h∙ = h∙

ηDisplayedSimpleCwF :
  DisplayedSimpleCwF ℓD₀ ℓD₁ LocalizedSyntaxCwF
   DisplayedSimpleCwF ℓD₀ ℓD₁ RawSyntaxCwF
ηDisplayedSimpleCwF 𝓓 = 𝓔
  where
  module Disp = DisplayedSimpleCwF 𝓓

  substSubPathP :
    {Γ Δ : Raw.Ctx}
    {Γ∙ : Disp.Ctx∙ Γ} {Δ∙ : Disp.Ctx∙ Δ}
    {σ τ : Subᴾ Γ Δ}
    {p q : σ  τ}
    {σ∙ : Disp.Sub∙ Γ∙ Δ∙ σ} {τ∙ : Disp.Sub∙ Γ∙ Δ∙ τ}
     p  q
     PathP  i  Disp.Sub∙ Γ∙ Δ∙ (p i)) σ∙ τ∙
     PathP  i  Disp.Sub∙ Γ∙ Δ∙ (q i)) σ∙ τ∙
  substSubPathP {Γ∙ = Γ∙} {Δ∙ = Δ∙} {σ∙ = σ∙} {τ∙ = τ∙} e =
    subst
       q  PathP  i  Disp.Sub∙ Γ∙ Δ∙ (q i)) σ∙ τ∙)
      e

  substTmPathP :
    {Γ : Raw.Ctx} {A : Raw.Ty}
    {Γ∙ : Disp.Ctx∙ Γ} {A∙ : Disp.Ty∙ A}
    {M N : Tmᴾ Γ A}
    {p q : M  N}
    {M∙ : Disp.Tm∙ Γ∙ A∙ M} {N∙ : Disp.Tm∙ Γ∙ A∙ N}
     p  q
     PathP  i  Disp.Tm∙ Γ∙ A∙ (p i)) M∙ N∙
     PathP  i  Disp.Tm∙ Γ∙ A∙ (q i)) M∙ N∙
  substTmPathP {Γ∙ = Γ∙} {A∙ = A∙} {M∙ = M∙} {N∙ = N∙} e =
    subst
       q  PathP  i  Disp.Tm∙ Γ∙ A∙ (q i)) M∙ N∙)
      e

  homPTm-subst :
    {Γ : Raw.Ctx} {A : Raw.Ty}
    {Γ∙ : Disp.Ctx∙ Γ} {A∙ : Disp.Ty∙ A}
    {M N : Tmᴾ Γ A}
    {h k : M  N}
    {M∙ : Disp.Tm∙ Γ∙ A∙ M} {N∙ : Disp.Tm∙ Γ∙ A∙ N}
     h  k
     Disp.Tm∙ Γ∙ A∙  M∙ ≤[ h ] N∙
     Disp.Tm∙ Γ∙ A∙  M∙ ≤[ k ] N∙
  homPTm-subst {Γ∙ = Γ∙} {A∙ = A∙} {M∙ = M∙} {N∙ = N∙} e =
    subst  h  Disp.Tm∙ Γ∙ A∙  M∙ ≤[ h ] N∙) e

  homPTm-η :
    {Γ : Raw.Ctx} {A : Raw.Ty}
    {Γ∙ : Disp.Ctx∙ Γ} {A∙ : Disp.Ty∙ A}
    {M N : Raw.Tm Γ A}
    (h : M  N)
    {M∙ : Disp.Tm∙ Γ∙ A∙ (ηTmᴾ M)}
    {N∙ : Disp.Tm∙ Γ∙ A∙ (ηTmᴾ N)}
     Disp.Tm∙ Γ∙ A∙  M∙ ≤[ hom-map ηTmᴾ h ] N∙
      M  Disp.Tm∙ Γ∙ A∙ (ηTmᴾ M))  M∙ ≤[ h ] N∙
  homPTm-η h h∙ = h∙

  𝓔 : DisplayedSimpleCwF _ _ RawSyntaxCwF
  DisplayedSimpleCwF.Ctx∙ 𝓔 = Disp.Ctx∙
  DisplayedSimpleCwF.Ty∙ 𝓔 = Disp.Ty∙
  DisplayedSimpleCwF.Sub∙ 𝓔 Γ∙ Δ∙ σ =
    Disp.Sub∙ Γ∙ Δ∙ (ηSubᴾ σ)
  DisplayedSimpleCwF.Tm∙ 𝓔 Γ∙ A∙ M =
    Disp.Tm∙ Γ∙ A∙ (ηTmᴾ M)
  DisplayedSimpleCwF.id∙ 𝓔 = Disp.id∙
  DisplayedSimpleCwF._∘∙_ 𝓔 = Disp._∘∙_
  DisplayedSimpleCwF.id-left∙ 𝓔 {σ = σ} σ∙ =
    substSubPathP (id-leftᴾ-η σ) (Disp.id-left∙ σ∙)
  DisplayedSimpleCwF.id-right∙ 𝓔 {σ = σ} σ∙ =
    substSubPathP (id-rightᴾ-η σ) (Disp.id-right∙ σ∙)
  DisplayedSimpleCwF.∘-assoc∙ 𝓔 {σ = σ} {τ = τ} {ρ = ρ} ρ∙ τ∙ σ∙ =
    substSubPathP (∘-assocᴾ-η ρ τ σ) (Disp.∘-assoc∙ ρ∙ τ∙ σ∙)
  DisplayedSimpleCwF._[_]Tm∙ 𝓔 = Disp._[_]Tm∙
  DisplayedSimpleCwF.Tm-id∙ 𝓔 {M = M} M∙ =
    substTmPathP (Tmᴾ-id-η M) (Disp.Tm-id∙ M∙)
  DisplayedSimpleCwF.Tm-∘∙ 𝓔 {M = M} {τ = τ} {σ = σ} M∙ τ∙ σ∙ =
    substTmPathP (Tmᴾ-∘-η M τ σ) (Disp.Tm-∘∙ M∙ τ∙ σ∙)
  DisplayedSimpleCwF.ε∙ 𝓔 = Disp.ε∙
  DisplayedSimpleCwF.ε-sub∙ 𝓔 = Disp.ε-sub∙
  DisplayedSimpleCwF.εη∙ 𝓔 {σ = σ} σ∙ =
    substSubPathP (εηᴾ-η σ) (Disp.εη∙ σ∙)
  DisplayedSimpleCwF._▷∙_ 𝓔 = Disp._▷∙_
  DisplayedSimpleCwF.p∙ 𝓔 = Disp.p∙
  DisplayedSimpleCwF.q∙ 𝓔 = Disp.q∙
  DisplayedSimpleCwF.⟨_,_⟩∙ 𝓔 = Disp.⟨_,_⟩∙
  DisplayedSimpleCwF.p-⟨⟩∙ 𝓔 {σ = σ} {M = M} σ∙ M∙ =
    substSubPathP (p-⟨⟩ᴾ-η σ M) (Disp.p-⟨⟩∙ σ∙ M∙)
  DisplayedSimpleCwF.q-⟨⟩∙ 𝓔 {σ = σ} {M = M} σ∙ M∙ =
    substTmPathP (q-⟨⟩ᴾ-η σ M) (Disp.q-⟨⟩∙ σ∙ M∙)
  DisplayedSimpleCwF.▷η∙ 𝓔 {Γ = Γ} {A = A} =
    substSubPathP (▷ηᴾ-η {Γ = Γ} {A = A}) Disp.▷η∙
  DisplayedSimpleCwF.⟨⟩-∘∙ 𝓔 {σ = σ} {M = M} {ρ = ρ} σ∙ M∙ ρ∙ =
    substSubPathP (⟨⟩-∘ᴾ-η σ M ρ) (Disp.⟨⟩-∘∙ σ∙ M∙ ρ∙)
  DisplayedSimpleCwF.Bool∙ 𝓔 = Disp.Bool∙
  DisplayedSimpleCwF.true∙ 𝓔 = Disp.true∙
  DisplayedSimpleCwF.false∙ 𝓔 = Disp.false∙
  DisplayedSimpleCwF.if∙ 𝓔 = Disp.if∙
  DisplayedSimpleCwF.true[]∙ 𝓔 {σ = σ} σ∙ =
    substTmPathP (true[]ᴾ-η σ) (Disp.true[]∙ σ∙)
  DisplayedSimpleCwF.false[]∙ 𝓔 {σ = σ} σ∙ =
    substTmPathP (false[]ᴾ-η σ) (Disp.false[]∙ σ∙)
  DisplayedSimpleCwF.if[]∙ 𝓔 {B = M} {T = N} {F = O} {σ = σ} M∙ N∙ O∙ σ∙ =
    substTmPathP (if[]ᴾ-η M N O σ) (Disp.if[]∙ M∙ N∙ O∙ σ∙)
  DisplayedSimpleCwF.βif-true∙ 𝓔 {T = T} {F = F} T∙ F∙ =
    homPTm-η (Raw.βif-true T F)
      (homPTm-subst (βif-trueᴾ-η T F) (Disp.βif-true∙ T∙ F∙))
  DisplayedSimpleCwF.βif-false∙ 𝓔 {T = T} {F = F} T∙ F∙ =
    homPTm-η (Raw.βif-false T F)
      (homPTm-subst (βif-falseᴾ-η T F) (Disp.βif-false∙ T∙ F∙))
  DisplayedSimpleCwF._×ᵗʸ∙_ 𝓔 = Disp._×ᵗʸ∙_
  DisplayedSimpleCwF.pair∙ 𝓔 = Disp.pair∙
  DisplayedSimpleCwF.fst∙ 𝓔 = Disp.fst∙
  DisplayedSimpleCwF.snd∙ 𝓔 = Disp.snd∙
  DisplayedSimpleCwF.pair[]∙ 𝓔 {M = M} {N = N} {σ = σ} M∙ N∙ σ∙ =
    substTmPathP (pair[]ᴾ-η M N σ) (Disp.pair[]∙ M∙ N∙ σ∙)
  DisplayedSimpleCwF.fst[]∙ 𝓔 {P = P} {σ = σ} P∙ σ∙ =
    substTmPathP (fst[]ᴾ-η P σ) (Disp.fst[]∙ P∙ σ∙)
  DisplayedSimpleCwF.snd[]∙ 𝓔 {P = P} {σ = σ} P∙ σ∙ =
    substTmPathP (snd[]ᴾ-η P σ) (Disp.snd[]∙ P∙ σ∙)
  DisplayedSimpleCwF.β×₁∙ 𝓔 {M = M} {N = N} M∙ N∙ =
    homPTm-η (Raw.β×₁ M N)
      (homPTm-subst (β×₁ᴾ-η M N) (Disp.β×₁∙ M∙ N∙))
  DisplayedSimpleCwF.β×₂∙ 𝓔 {M = M} {N = N} M∙ N∙ =
    homPTm-η (Raw.β×₂ M N)
      (homPTm-subst (β×₂ᴾ-η M N) (Disp.β×₂∙ M∙ N∙))
  DisplayedSimpleCwF.η×∙ 𝓔 {P = P} P∙ =
    homPTm-η (Raw.η× P)
      (homPTm-subst (η×ᴾ-η P) (Disp.η×∙ P∙))
  DisplayedSimpleCwF._⇒ᵗʸ∙_ 𝓔 = Disp._⇒ᵗʸ∙_
  DisplayedSimpleCwF.lam∙ 𝓔 = Disp.lam∙
  DisplayedSimpleCwF.app∙ 𝓔 = Disp.app∙
  DisplayedSimpleCwF.lam[]∙ 𝓔 {N = N} {σ = σ} N∙ σ∙ =
    substTmPathP (lam[]ᴾ-η N σ) (Disp.lam[]∙ N∙ σ∙)
  DisplayedSimpleCwF.app[]∙ 𝓔 {F = F} {M = M} {σ = σ} F∙ M∙ σ∙ =
    substTmPathP (app[]ᴾ-η F M σ) (Disp.app[]∙ F∙ M∙ σ∙)
  DisplayedSimpleCwF.β⇒∙ 𝓔 {N = N} {M = M} N∙ M∙ =
    homPTm-η (Raw.β⇒ N M)
      (homPTm-subst (β⇒ᴾ-η N M) (Disp.β⇒∙ N∙ M∙))
  DisplayedSimpleCwF.η⇒∙ 𝓔 {F = F} F∙ =
    homPTm-η (Raw.η⇒ F)
      (homPTm-subst (η⇒ᴾ-η F) (Disp.η⇒∙ F∙))