open import Cubical.Foundations.Prelude hiding (Sub)
open import Cubical.Foundations.HLevels

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

open import TT.Groupoid.Syntax X Y

private variable
  Γ Δ Θ : Con
  A B : Ty Γ

record DModel : Type₁ where
  no-eta-equality

  infixl 9 _[_]ᵀᴹ
  field
    Tyᴹ : (Γ : Con)  Ty Γ  Type
    isSetTyᴹ : (Γ : Con) (A : Ty Γ)  isSet (Tyᴹ Γ A)

    _[_]ᵀᴹ : Tyᴹ Γ A  (γ : Sub Δ Γ)  Tyᴹ Δ (A [ γ ]ᵀ)
    []ᵀ-∘ᴹ :
      (Aᴹ : Tyᴹ Γ A) (γ : Sub Δ Γ) (δ : Sub Θ Δ) 
      PathP  i  Tyᴹ Θ ([]ᵀ-∘ A γ δ i))
        (Aᴹ [ γ  δ ]ᵀᴹ)
        (Aᴹ [ γ ]ᵀᴹ [ δ ]ᵀᴹ)
    []ᵀ-idᴹ :
      (Aᴹ : Tyᴹ Γ A)  PathP  i  Tyᴹ Γ ([]ᵀ-id A i)) (Aᴹ [ id ]ᵀᴹ) Aᴹ

    Uᴹ : Tyᴹ Γ U
    U-[]ᴹ : (γ : Sub Δ Γ)  PathP  i  Tyᴹ Δ (U-[] γ i)) (Uᴹ [ γ ]ᵀᴹ) Uᴹ

    Elᴹ : ( : Tm Γ U)  Tyᴹ Γ (El )
    El-[]ᴹ :
      ( : Tm Γ U) (γ : Sub Δ Γ) 
      PathP  i  Tyᴹ Δ (El-[]  γ i)) (Elᴹ  [ γ ]ᵀᴹ) (Elᴹ ( [ γ ]ᵘ))

    Πᴹ : Tyᴹ Γ A  Tyᴹ (Γ  A) B  Tyᴹ Γ (Π A B)
    Π-[]ᴹ :
      (Aᴹ : Tyᴹ Γ A) (Bᴹ : Tyᴹ (Γ  A) B) (γ : Sub Δ Γ) 
      PathP  i  Tyᴹ Δ (Π-[] A B γ i))
        (Πᴹ Aᴹ Bᴹ [ γ ]ᵀᴹ)
        (Πᴹ (Aᴹ [ γ ]ᵀᴹ) (Bᴹ [ γ  ]ᵀᴹ))

  []ᵀ-⁺-∘ᴹ-filler :
    (Bᴹ : Tyᴹ (Γ  A) B) (γ : Sub Δ Γ) (δ : Sub Θ Δ) 
    (j i : I)  Tyᴹ (Θ  []ᵀ-∘ A γ δ i) ([]ᵀ-⁺-∘-filler B γ δ j i)
  []ᵀ-⁺-∘ᴹ-filler Bᴹ γ δ j i =
    fill  j  Tyᴹ _ ([]ᵀ-⁺-∘-filler _ γ δ j i))
       where
        j (i = i0)  Bᴹ [ (γ  δ)  ]ᵀᴹ
        j (i = i1)  []ᵀ-∘ᴹ Bᴹ (γ ) (δ ) j)
      (inS (Bᴹ [ ⁺-∘ γ δ i ]ᵀᴹ))
      j

  []ᵀ-⁺-idᴹ-filler :
    (Bᴹ : Tyᴹ (Γ  A) B) 
    (j i : I)  Tyᴹ (Γ  []ᵀ-id A i) ([]ᵀ-⁺-id-filler B j i)
  []ᵀ-⁺-idᴹ-filler Bᴹ j i =
    fill  j  Tyᴹ _ ([]ᵀ-⁺-id-filler _ j i))
       where
        j (i = i0)  Bᴹ [ id  ]ᵀᴹ
        j (i = i1)  []ᵀ-idᴹ Bᴹ j)
      (inS (Bᴹ [ ⁺-id i ]ᵀᴹ))
      j

  []ᵀ-p-⁺ᴹ-filler :
    (Bᴹ : Tyᴹ Γ B) (γ : Sub Δ Γ) 
    (j i : I)  Tyᴹ (Δ  A [ γ ]ᵀ) ([]ᵀ-p-⁺-filler B γ j i)
  []ᵀ-p-⁺ᴹ-filler Bᴹ γ j i =
    fill  j  Tyᴹ _ ([]ᵀ-p-⁺-filler _ γ j i))
       where
        j (i = i0)  []ᵀ-∘ᴹ Bᴹ p (γ ) j
        j (i = i1)  []ᵀ-∘ᴹ Bᴹ γ p j)
      (inS (Bᴹ [ p-⁺ γ i ]ᵀᴹ))
      j

  []ᵀ-p-⟨⟩ᴹ-filler :
    (Bᴹ : Tyᴹ Γ B) (a : Tm Γ A) (j i : I)  Tyᴹ Γ ([]ᵀ-p-⟨⟩-filler B a j i)
  []ᵀ-p-⟨⟩ᴹ-filler Bᴹ a j i =
    fill  j  Tyᴹ _ ([]ᵀ-p-⟨⟩-filler _ a j i))
       where
        j (i = i0)  []ᵀ-∘ᴹ Bᴹ p  a  j
        j (i = i1)  []ᵀ-idᴹ Bᴹ j)
      (inS (Bᴹ [ p-⟨⟩ a i ]ᵀᴹ))
      j

module Elim (M : DModel) where
  open DModel M

  ⟦_⟧ : (A : Ty Γ)  Tyᴹ Γ A
   isGroupoidTy Γ A₀ A₁ P₀ P₁ S₀ S₁ i j k  =
    isGroupoid→CubeP  i j k  Tyᴹ Γ (isGroupoidTy Γ A₀ A₁ P₀ P₁ S₀ S₁ i j k))
       j k   S₀ j k )
       j k   S₁ j k )
       i k   P₀ k )
       i k   P₁ k )
       i j   A₀ )
       i j   A₁ )
      (isSet→isGroupoid (isSetTyᴹ Γ A₁))
      i j k
   A [ γ ]ᵀ  =  A  [ γ ]ᵀᴹ

   []ᵀ-∘ A γ δ i  = []ᵀ-∘ᴹ  A  γ δ i
   []ᵀ-id A i  = []ᵀ-idᴹ  A  i

   []ᵀ-⁺-∘ B γ δ i  = []ᵀ-⁺-∘ᴹ-filler  B  γ δ i1 i
   []ᵀ-⁺-∘-filler B γ δ j i  = []ᵀ-⁺-∘ᴹ-filler  B  γ δ j i

   []ᵀ-⁺-id B i  = []ᵀ-⁺-idᴹ-filler  B  i1 i
   []ᵀ-⁺-id-filler B j i  = []ᵀ-⁺-idᴹ-filler  B  j i

   []ᵀ-p-⁺ B γ i  = []ᵀ-p-⁺ᴹ-filler  B  γ i1 i
   []ᵀ-p-⁺-filler B γ j i  = []ᵀ-p-⁺ᴹ-filler  B  γ j i

   []ᵀ-p-⟨⟩ B a i  = []ᵀ-p-⟨⟩ᴹ-filler  B  a i1 i
   []ᵀ-p-⟨⟩-filler B a j i  = []ᵀ-p-⟨⟩ᴹ-filler  B  a j i

   U  = Uᴹ
   U-[] γ i  = U-[]ᴹ γ i

   U-[]-∘ γ δ i j  =
    isSet→SquareP  i j  isSetTyᴹ _ (U-[]-∘ γ δ i j))
      ([]ᵀ-∘ᴹ Uᴹ γ δ)
      refl
      (U-[]ᴹ (γ  δ))
      (compPathP' {B = Tyᴹ _}  i  U-[]ᴹ γ i [ δ ]ᵀᴹ) (U-[]ᴹ δ))
      i j
   U-[]-id i j  =
    isSet→SquareP  i j  isSetTyᴹ _ (U-[]-id i j))
      ([]ᵀ-idᴹ Uᴹ)
      refl
      (U-[]ᴹ id)
      refl
      i j

   El   = Elᴹ 
   El-[]  γ i  = El-[]ᴹ  γ i
   El-[]-∘  γ δ i j  =
    isSet→SquareP  i j  isSetTyᴹ _ (El-[]-∘  γ δ i j))
      ([]ᵀ-∘ᴹ (Elᴹ ) γ δ)
       i  Elᴹ ([]ᵘ-∘  γ δ i))
      (El-[]ᴹ  (γ  δ))
      (compPathP' {B = Tyᴹ _}
         i  El-[]ᴹ  γ i [ δ ]ᵀᴹ)
        (El-[]ᴹ ( [ γ ]ᵘ) δ))
      i j
   El-[]-id  i j  =
    isSet→SquareP  i j  isSetTyᴹ _ (El-[]-id  i j))
      ([]ᵀ-idᴹ (Elᴹ ))
       i  Elᴹ ([]ᵘ-id  i))
      (El-[]ᴹ  id)
      refl
      i j

   Π A B  = Πᴹ  A   B 
   Π-[] A B γ i  = Π-[]ᴹ  A   B  γ i

   Π-[]-∘ A B γ δ i j  =
    isSet→SquareP  i j  isSetTyᴹ _ (Π-[]-∘ A B γ δ i j))
      ([]ᵀ-∘ᴹ (Πᴹ  A   B ) γ δ)
       i  Πᴹ ([]ᵀ-∘ᴹ  A  γ δ i) ([]ᵀ-⁺-∘ᴹ-filler  B  γ δ i1 i))
      (Π-[]ᴹ  A   B  (γ  δ))
      (compPathP' {B = Tyᴹ _}
         i  Π-[]ᴹ  A   B  γ i [ δ ]ᵀᴹ)
        (Π-[]ᴹ ( A  [ γ ]ᵀᴹ) ( B  [ γ  ]ᵀᴹ) δ))
      i j
   Π-[]-id A B i j  =
    isSet→SquareP  i j  isSetTyᴹ _ (Π-[]-id A B i j))
      ([]ᵀ-idᴹ (Πᴹ  A   B ))
       i  Πᴹ ([]ᵀ-idᴹ  A  i) ([]ᵀ-⁺-idᴹ-filler  B  i1 i))
      (Π-[]ᴹ  A   B  id)
      refl
      i j