module GpdCont.Fibration where
open import GpdCont.Prelude
open import Cubical.Foundations.Equiv
open import Cubical.Foundations.Equiv.Properties
  using (hasSection)
  public
open import Cubical.Foundations.HLevels
open import Cubical.Foundations.Isomorphism as Isomorphism
  using (Iso ; invIso ; section ; _Iso⟨_⟩_)
  renaming (_∎Iso to _Iso∎)
open import Cubical.Data.Sigma.Properties as Sigma
open Iso
private
  variable
    ℓ : Level
    X Y : Type ℓ
    A : Type ℓ
    B : A → Type ℓ
Section : (B : A → Type ℓ) → Type _
Section {A} B = (a : A) → B a
isOfHLevelSection : (n : HLevel) → (∀ a → isOfHLevel n (B a)) → isOfHLevel n (Section B)
isOfHLevelSection n = isOfHLevelΠ n
hasSection-fiberSection-Iso : (f : X → Y) → Iso (hasSection f) (Section $ fiber f)
hasSection-fiberSection-Iso f = invIso Sigma.Σ-Π-Iso
module Total (X : Type ℓ) (Y : X → Type ℓ) where
  Total : Type _
  Total = Σ[ x ∈ X ] (Y x)
  isOfHLevelTotal : ∀ n → isOfHLevel n X → (∀ x → isOfHLevel n (Y x)) → isOfHLevel n Total
  isOfHLevelTotal = isOfHLevelΣ
  proj : Total → X
  proj = fst
  fiber-proj→Family : ∀ x → fiber proj x → Y x
  fiber-proj→Family x ((x′ , y′) , p) = subst Y p y′
  Family→fiber-proj : ∀ x → Y x → fiber proj x
  Family→fiber-proj x y .fst = x , y
  Family→fiber-proj x y .snd = refl
  
  fiberProj-Family-Iso : ∀ x → Iso (fiber proj x) (Y x)
  fiberProj-Family-Iso x .Iso.fun = fiber-proj→Family x
  fiberProj-Family-Iso x .Iso.inv = Family→fiber-proj x
  fiberProj-Family-Iso x .Iso.rightInv y = substRefl {B = Y} y
  fiberProj-Family-Iso x .Iso.leftInv t@((x′ , y′) , p) = sym left-inv where
    left-inv : t ≡ Family→fiber-proj x (fiber-proj→Family x t)
    left-inv i .fst .fst = p i
    left-inv i .fst .snd = subst-filler Y p y′ i
    left-inv i .snd j = p (i ∨ j)
  hasSectionProj-SectionFam-Iso : Iso (hasSection proj) (Section Y)
  hasSectionProj-SectionFam-Iso =
    hasSection proj       Iso⟨ hasSection-fiberSection-Iso proj ⟩
    Section (fiber proj)  Iso⟨ Isomorphism.codomainIsoDep fiberProj-Family-Iso ⟩
    Section Y             Iso∎