{-# OPTIONS --safe #-}
module Cubical.Categories.Displayed.Fibration.IsoFibration where

open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Equiv
open import Cubical.Data.Sigma

open import Cubical.Categories.Category.Base
open import Cubical.Categories.Constructions.BinProduct
open import Cubical.Categories.Displayed.Base
open import Cubical.Categories.Displayed.Functor

private
  variable
    ℓC ℓC' ℓCᴰ ℓCᴰ' ℓD ℓD' ℓDᴰ ℓDᴰ' ℓP ℓP' : Level

open Category
open Functorᴰ
open isIso

module _ {C : Category ℓC ℓC'} (Cᴰ : Categoryᴰ C ℓCᴰ ℓCᴰ') where
  private
    module Cᴰ = Categoryᴰ Cᴰ
  record WeakIsoLift {c c'}
    (cᴰ : Cᴰ.ob[ c' ]) (f : CatIso C c c')
    : Type (ℓ-max ℓCᴰ ℓCᴰ')
    where
    field
      f*cᴰ : Cᴰ.ob[ c ]
      π : Cᴰ.Hom[ f .fst ][ f*cᴰ , cᴰ ]
      σ : Cᴰ.Hom[ f .snd .inv ][ cᴰ , f*cᴰ ]

  record WeakIsoLift' {c c'}
    (cᴰ : Cᴰ.ob[ c ]) (f : CatIso C c c')
    : Type (ℓ-max ℓCᴰ ℓCᴰ')
    where
    field
      f*cᴰ : Cᴰ.ob[ c' ]
      σ : Cᴰ.Hom[ f .fst ][ cᴰ , f*cᴰ ]
      π : Cᴰ.Hom[ f .snd .inv ][ f*cᴰ , cᴰ ]

  isWeakIsoFibration : Type (ℓ-max (ℓ-max (ℓ-max ℓC ℓC') ℓCᴰ) ℓCᴰ')
  isWeakIsoFibration =  {c c'} (cᴰ : Cᴰ.ob[ c' ]) (f : CatIso C c c')
     WeakIsoLift cᴰ f

  isWeakIsoFibration' : Type (ℓ-max (ℓ-max (ℓ-max ℓC ℓC') ℓCᴰ) ℓCᴰ')
  isWeakIsoFibration' =  {c c'} (cᴰ : Cᴰ.ob[ c ]) (f : CatIso C c c')
     WeakIsoLift' cᴰ f