module DPRLR.Gluing.Simple.Judgment where

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

open import DPRLR.Simplicial.Hom
open import DPRLR.Simplicial.Contravariant
open import DPRLR.Object.Simple.Model

module _ {ℓM : Level} (𝓜 : SimpleDirectedCwF ℓM) where
  infix 4 _≤ᵍ_

  open SimpleDirectedCwF 𝓜
    renaming
      ( Ctx to Ctxₘ
      ; Ty to Tyₘ
      ; Sub to Subₘ
      ; Tm to Tmₘ
      ; ε to εₘ
      ; _∘_ to _∘ₘ_
      ; _[_]Tm to _[_]Tmₘ
      )

  record GluCtx : Type (ℓ-suc ℓM) where
    field
      Γ° : Ctxₘ
      Γ∙ : Subₘ εₘ Γ°  Type ℓM

  open GluCtx public

  record GluSub (Γ Δ : GluCtx) : Type (ℓ-suc ℓM) where
    field
      σ° : Subₘ (Γ° Γ) (Γ° Δ)
      σ∙ : (γ° : Subₘ εₘ (Γ° Γ))  Γ∙ Γ γ°  Γ∙ Δ (σ° ∘ₘ γ°)

  open GluSub public

  record GluTy : Type (ℓ-suc ℓM) where
    field
       : Tyₘ
      A∙ : Tmₘ εₘ   Type ℓM
      cA : isContravariant A∙

  open GluTy public

  record GluTm (Γ : GluCtx) (A : GluTy) : Type (ℓ-suc ℓM) where
    field
       : Tmₘ (Γ° Γ) ( A)
      M∙ : (γ° : Subₘ εₘ (Γ° Γ)) (γ∙ : Γ∙ Γ γ°)
         A∙ A ( [ γ° ]Tmₘ)

  open GluTm public

  record _≤ᵍ_ {Γ : GluCtx} {A : GluTy}
    (M N : GluTm Γ A) : Type (ℓ-suc ℓM) where
    field
       :  M   N
      r∙ : (γ° : Subₘ εₘ (Γ° Γ)) (γ∙ : Γ∙ Γ γ°)
         A∙ A  M∙ M γ° γ∙
          ≤[ hom-map  t  t [ γ° ]Tmₘ)  ]
          M∙ N γ° γ∙

  open _≤ᵍ_ public

  ≤ᵍ→≤ :
    {Γ : GluCtx} {A : GluTy} {M N : GluTm Γ A}
     M ≤ᵍ N
     M  N
  ≤ᵍ→≤ {M = M} {N = N} r =
     i 
      record
        {  = hom-path (_≤ᵍ_.r° r) i
        ; M∙ = λ γ° γ∙ 
            let (q , _) = _≤ᵍ_.r∙ r γ° γ∙ in q i
        })
    , left
    , right
    where
    left : _  M
    GluTm.M° (left i) = left-endpoint (_≤ᵍ_.r° r) i
    GluTm.M∙ (left i) γ° γ∙ =
      let (_ , l , _) = _≤ᵍ_.r∙ r γ° γ∙ in l i

    right : _  N
    GluTm.M° (right i) = right-endpoint (_≤ᵍ_.r° r) i
    GluTm.M∙ (right i) γ° γ∙ =
      let (_ , _ , r′) = _≤ᵍ_.r∙ r γ° γ∙ in r′ i

  ≤→≤ᵍ :
    {Γ : GluCtx} {A : GluTy} {M N : GluTm Γ A}
     M  N
     M ≤ᵍ N
  _≤ᵍ_.r° (≤→≤ᵍ h) = hom-map GluTm.M° h
  _≤ᵍ_.r∙ (≤→≤ᵍ h) γ° γ∙ =
     i  GluTm.M∙ (hom-path h i) γ° γ∙)
    ,  i  GluTm.M∙ (left-endpoint h i) γ° γ∙)
    ,  i  GluTm.M∙ (right-endpoint h i) γ° γ∙)

  ≤ᵍIso≤ :
    {Γ : GluCtx} {A : GluTy} (M N : GluTm Γ A)
     Iso (M ≤ᵍ N) (M  N)
  Iso.fun (≤ᵍIso≤ M N) = ≤ᵍ→≤
  Iso.inv (≤ᵍIso≤ M N) = ≤→≤ᵍ
  Iso.rightInv (≤ᵍIso≤ M N) h = refl
  Iso.leftInv (≤ᵍIso≤ M N) r = refl

  ≤ᵍ≃≤ :
    {Γ : GluCtx} {A : GluTy} (M N : GluTm Γ A)
     (M ≤ᵍ N)  (M  N)
  ≤ᵍ≃≤ M N = isoToEquiv (≤ᵍIso≤ M N)