{-# OPTIONS --without-K --exact-split --two-level #-}

--------------------------------------------------------------------------------
-- Remark 4.4  and  Definition 5.11.
--
-- Two of the gluing-layer definitions, formalized as the type of the
-- data they require (the fibrant universe being the inner universe `UU 𝓤`).
--
--   * `satisfies-homotopy-glue-rules (i,𝓤)`: for every input datum (A,T,f) an
--     output (Glue, p, unglue) with strict boundary and every unglue_ψ an
--     equivalence (Remark 4.4, on items (1)-(3) of Definition 4.1).
--   * `WeakGlue (I,0,1,𝓤)`: the sharply-weakened structure of Definition 5.11:
--     a family, two *paths in the universe*, mere maps, and endpoint homotopies.
--
-- These are definitions, not theorems; they package the axioms the later
-- gluing↔univalence results (Theorem 5.14, Theorem 5.15)
-- range over.
--------------------------------------------------------------------------------

module Extension.GlueRules where

open import Extension.Univalence using (Univalence ; ua-from ; ua-from-β)
open import Extension.Prelude

private
  variable
    ℓφ ℓΨ ℓI : Level

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

module _ {Φ : UUᵉ ℓφ} {Ψ : UUᵉ ℓΨ} (i : Φ  Ψ) (𝓤 : Level) where

  satisfies-homotopy-glue-rules : UUᵉ (ℓφ  ℓΨ  lsuc 𝓤)
  satisfies-homotopy-glue-rules =
    (A : Ψ  UU 𝓤) (T : Φ  UU 𝓤) (f : (φ : Φ)  C (T φ  A (i φ)))
     Σᵉ (Ψ  UU 𝓤)  Gl 
      Σᵉ ((λ φ  Gl (i φ)) =ᵉ T)  p 
      Σᵉ ((ψ : Ψ)  Gl ψ  A ψ)  ung 
      -- boundary (item 3): unglue_{iφ} ≐ f_φ, the map coerced along p.  Maps
      -- between inner types are compared strictly through their conversions `c`.
      Σᵉ ((φ : Φ)  c (ung (i φ))
             =ᵉ exo-tr  H  (ξ : Φ)  C (H ξ  A (i ξ))) (exo-inv p)
                        ξ  c (pr1 (ic (f ξ)))) φ)
          _ 
      -- (2) each unglue_ψ is an equivalence
      (ψ : Ψ)  C (isEquiv (ung ψ))))))

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

module _ (I : UUᵉ ℓI) (0I 1I : I) (𝓤 : Level) where

  WeakGlue : UUᵉ (ℓI  lsuc 𝓤)
  WeakGlue =
    (A B : UU 𝓤) (f : C (A  B))
     Σᵉ (I  UU 𝓤)  G 
      Σᵉ (C (Id (G 0I) A))  b₀            -- path in the universe
      Σᵉ (C (Id (G 1I) B))  b₁            -- path in the universe
      Σᵉ ((t : I)  C (G t  B))  u       -- mere maps
      -- (4) endpoint homotopies:  u₀ ∼ f ∘ idtoeqv(b₀),  u₁ ∼ idtoeqv(b₁)
      Σᵉ (C (ic (u 0I) ~  x  pr1 (ic f) (pr1 (idtoeqv (ic b₀)) x))))  _ 
          C (ic (u 1I) ~ pr1 (idtoeqv (ic b₁))))))))

  -- Remark 5.12.  With a univalent universe, the weak structure is
  -- inhabited with no structure on I: take G ≔ λ_.B, b₀ ≔ ua(f)⁻¹, b₁ ≔ refl,
  -- u ≔ λ_.id_B; the endpoint homotopies come from the univalence β-rule.
  private
    -- idtoeqv of a path and of its inverse cancel (path induction).
    idtoeqv-inv-sec : {A B : UU 𝓤} (pth : Id A B) (y : B)
                     Id (pr1 (idtoeqv pth) (pr1 (idtoeqv (pth ⁻¹)) y)) y
    idtoeqv-inv-sec refl y = refl

  ua-gives-weak-glue : Univalence 𝓤  WeakGlue
  ua-gives-weak-glue U A B f =
     _  B)
    ,ᵉ (c ((ua-from U g) ⁻¹)
    ,ᵉ (c refl
    ,ᵉ ((λ _  c  x  x))
    ,ᵉ (c H₀ ,ᵉ c H₁))))
    where
    g : A  B
    g = ic f
    H₀ :  (x : B)  x)
       ~  x  pr1 (ic f) (pr1 (idtoeqv (ic (c ((ua-from U g) ⁻¹)))) x))
    H₀ y = (idtoeqv-inv-sec (ua-from U g) y) ⁻¹
           · ap  e  pr1 e (pr1 (idtoeqv ((ua-from U g) ⁻¹)) y))
                (ua-from-β U g)
    H₁ :  (x : B)  x) ~ pr1 (idtoeqv (ic (c (refl {x = B}))))
    H₁ y = refl