open import Cubical.Foundations.Prelude hiding (Sub)
open import Cubical.Foundations.HLevels
open import Cubical.Data.Unit.Base

module TT.Groupoid.ToSet (X : hSet ℓ-zero) (Y : X .fst  hSet ℓ-zero) where

import TT.Groupoid.Syntax X Y as G
open import TT.Set.Syntax X Y

module S where
  private variable
    Γ Δ Θ : Con
    A : Ty Γ

  []ᵀ-⁺-∘ :
    (B : Ty (Γ  A)) (γ : Sub Δ Γ) (δ : Sub Θ Δ) 
    PathP  i  Ty (Θ  []ᵀ-∘ A γ δ i))
      (B [ (γ  δ)  ]ᵀ)
      (B [ γ  ]ᵀ [ δ  ]ᵀ)
  []ᵀ-⁺-∘ {A} {Θ} B γ δ = λ i  filler i1 i
    module []ᵀ-⁺-∘ where
    filler : I  (i : I)  Ty (Θ  []ᵀ-∘ A γ δ i)
    filler j i =
      hfill
         where
          j (i = i0)  B [ (γ  δ)  ]ᵀ
          j (i = i1)  []ᵀ-∘ B (γ ) (δ ) j)
        (inS (B [ ⁺-∘ γ δ i ]ᵀ))
        j

  []ᵀ-⁺-id :
    (B : Ty (Γ  A))  PathP  i  Ty (Γ  []ᵀ-id A i)) (B [ id  ]ᵀ) B
  []ᵀ-⁺-id {Γ} {A} B = λ i  filler i1 i
    module []ᵀ-⁺-id where
    filler : I  (i : I)  Ty (Γ  []ᵀ-id A i)
    filler j i =
      hfill
         where
          j (i = i0)  B [ id  ]ᵀ
          j (i = i1)  []ᵀ-id B j)
        (inS (B [ ⁺-id i ]ᵀ))
        j

  []ᵘ-∘ :
    ( : Tm Γ U) (γ : Sub Δ Γ) (δ : Sub Θ Δ)   [ γ  δ ]ᵘ   [ γ ]ᵘ [ δ ]ᵘ
  []ᵘ-∘ {Θ}  γ δ i =
    comp
       j 
        Tm Θ
          (isSet→isSet' (isSetTy Θ)
            ([]ᵀ-∘ U γ δ)
            refl
            (U-[] (γ  δ))
            (cong _[ δ ]ᵀ (U-[] γ)  U-[] δ)
            j i))
       where
        j (i = i0)  []ᵘ-filler  (γ  δ) j
        j (i = i1) 
          comp
             i  Tm Θ (compPath-filler (cong _[ δ ]ᵀ (U-[] γ)) (U-[] δ) i j))
             where
              i (j = i0)   [ γ ]ᵗ [ δ ]ᵗ
              i (j = i1)  []ᵘ-filler ( [ γ ]ᵘ) δ i)
            ([]ᵘ-filler  γ j [ δ ]ᵗ))
      ([]ᵗ-∘  γ δ i)

  []ᵘ-id : ( : Tm Γ U)   [ id ]ᵘ  
  []ᵘ-id {Γ}  i =
    comp
       j  Tm Γ (isSet→isSet' (isSetTy Γ) ([]ᵀ-id U) refl (U-[] id) refl j i))
       where
        j (i = i0)  []ᵘ-filler  id j
        j (i = i1)  )
      ([]ᵗ-id  i)

open S

⟦_⟧ₛ : G.Sort  Sort
⟦_⟧ :  {S}  G.EL S  EL  S ⟧ₛ

 G.con ⟧ₛ = con
 G.sub Δ Γ ⟧ₛ = sub  Δ   Γ 
 G.ty A ⟧ₛ = ty  A 
 G.tm Γ A ⟧ₛ = tm  Γ   A 

 G.isSetSub Δ Γ γ₀ γ₁ P₀ P₁ i j  =
  isSetSub  Δ   Γ   γ₀   γ₁   j   P₀ j )  j   P₁ j ) i j
 γ G.∘ δ  =  γ    δ 
 G.assoc γ δ θ i  = assoc  γ   δ   θ  i
 G.id  = id
 G.idr γ i  = idr  γ  i
 G.idl γ i  = idl  γ  i

 G.isGroupoidTy Γ A₀ A₁ P₀ P₁ S₀ S₁ i j k  =
  isSet→isGroupoid (isSetTy  Γ )
     A₀ 
     A₁ 
     k   P₀ k )
     k   P₁ k )
     j k   S₀ j k )
     j k   S₁ j k )
    i j k
 A G.[ γ ]ᵀ  =  A  [  γ  ]ᵀ
 G.[]ᵀ-∘ A γ δ i  = []ᵀ-∘  A   γ   δ  i
 G.[]ᵀ-id A i  = []ᵀ-id  A  i

 G.isSetTm Γ A a₀ a₁ P₀ P₁ i j  =
  isSetTm  Γ   A   a₀   a₁   j   P₀ j )  j   P₁ j ) i j
 a G.[ γ ]ᵗ  =  a  [  γ  ]ᵗ
 G.[]ᵗ-∘ a γ δ i  = []ᵗ-∘  a   γ   δ  i
 G.[]ᵗ-id a i  = []ᵗ-id  a  i

 G.◇  = 
 G.ε  = ε
 G.ε-∘ γ i  = ε-∘  γ  i
 G.◇-η i  = ◇-η i

 Γ G.▹ A  =  Γ    A 
 G.p  = p
 G.q  = q
 γ G.⁺  =  γ  
 G.⟨ a   =   a  
 G.⟨⟩-∘ a γ i  = ⟨⟩-∘  a   γ  i
 G.▹-η i  = ▹-η i

 G.⁺-∘ γ δ i  = ⁺-∘  γ   δ  i
 G.[]ᵀ-⁺-∘ B γ δ i  = []ᵀ-⁺-∘  B   γ   δ  i
 G.[]ᵀ-⁺-∘-filler B γ δ j i  = []ᵀ-⁺-∘.filler  B   γ   δ  j i
 G.⁺-id i  = ⁺-id i
 G.[]ᵀ-⁺-id B i  = []ᵀ-⁺-id  B  i
 G.[]ᵀ-⁺-id-filler B j i  = []ᵀ-⁺-id.filler  B  j i

 G.p-⁺ γ i  = p-⁺  γ  i
 G.[]ᵀ-p-⁺ B γ i  = []ᵀ-p-⁺  B   γ  i
 G.[]ᵀ-p-⁺-filler B γ j i  =
  isSet→isSet' (isSetTy _)
    (cong ( B  [_]ᵀ) (p-⁺  γ ))
    ([]ᵀ-p-⁺  B   γ )
    ([]ᵀ-∘  B  p ( γ  ))
    ([]ᵀ-∘  B   γ  p)
    j i
 G.q-⁺ γ i  = q-⁺  γ  i

 G.p-⟨⟩ a i  = p-⟨⟩  a  i
 G.[]ᵀ-p-⟨⟩ B a i  = []ᵀ-p-⟨⟩  B   a  i
 G.[]ᵀ-p-⟨⟩-filler B a j i  =
  isSet→isSet' (isSetTy _)
    (cong ( B  [_]ᵀ) (p-⟨⟩  a ))
    ([]ᵀ-p-⟨⟩  B   a )
    ([]ᵀ-∘  B  p   a  )
    ([]ᵀ-id  B )
    j i
 G.q-⟨⟩ a i  = q-⟨⟩  a  i

 G.U  = U
 G.U-[] γ i  = U-[]  γ  i
 G.U-[]-∘ γ δ j i  =
  isSet→isSet' (isSetTy _)
    ([]ᵀ-∘ U  γ   δ )
    refl
    (U-[] ( γ    δ ))
    (compPathP' {A = Unit} {p = refl} {q = refl}
      (cong _[  δ  ]ᵀ (U-[]  γ ))
      (U-[]  δ ))
    j i
 G.U-[]-id j i  = isSet→isSet' (isSetTy _) ([]ᵀ-id U) refl (U-[] id) refl j i

  G.[ γ ]ᵘ  =    [  γ  ]ᵘ
 G.[]ᵘ-filler  γ i  = []ᵘ-filler     γ  i
 G.[]ᵘ-∘  γ δ i  = []ᵘ-∘     γ   δ  i
 G.[]ᵘ-id  i  = []ᵘ-id    i

 G.El   = El   
 G.El-[]  γ i  = El-[]     γ  i
 G.El-[]-∘  γ δ i j  =
  isSet→isSet' (isSetTy _)
    ([]ᵀ-∘ (El   )  γ   δ )
    (cong El ([]ᵘ-∘     γ   δ ))
    (El-[]    ( γ    δ ))
    (compPathP' {A = Unit} {p = refl} {q = refl}
      (cong _[  δ  ]ᵀ (El-[]     γ ))
      (El-[] (   [  γ  ]ᵘ)  δ ))
    i j
 G.El-[]-id  i j  =
  isSet→isSet' (isSetTy _)
    ([]ᵀ-id (El   ))
    (cong El ([]ᵘ-id   ))
    (El-[]    id)
    refl
    i j

 G.Π A B  = Π  A   B 
 G.Π-[] A B γ i  = Π-[]  A   B   γ  i
 G.Π-[]-∘ A B γ δ i j  =
  isSet→isSet' (isSetTy _)
    ([]ᵀ-∘ (Π  A   B )  γ   δ )
    (cong₂ Π ([]ᵀ-∘  A   γ   δ ) ([]ᵀ-⁺-∘  B   γ   δ ))
    (Π-[]  A   B  ( γ    δ ))
    (compPathP' {A = Unit} {p = refl} {q = refl}
      (cong _[  δ  ]ᵀ (Π-[]  A   B   γ ))
      (Π-[] ( A  [  γ  ]ᵀ) (⟦B⟧ [  γ   ]ᵀ)  δ ))
    i j
  where
  ⟦B⟧ : Ty (_  _)
  ⟦B⟧ =  B 
 G.Π-[]-id A B i j  =
  isSet→isSet' (isSetTy _)
    ([]ᵀ-id (Π  A   B ))
    (cong₂ Π ([]ᵀ-id  A ) ([]ᵀ-⁺-id  B ))
    (Π-[]  A   B  id)
    refl
    i j

 G.app f  = app  f 
 G.lam b  = lam  b 
 G.lam-[] b γ i  = lam-[]  b   γ  i
 G.Π-β b i  = Π-β  b  i
 G.Π-η f i  = Π-η  f  i

 G.in-X x  = in-X x
 G.in-Y y  = in-Y y