module Cubical.Categories.LocallySmall.Functor.IntoFiberCategory where

open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Function
open import Cubical.Foundations.HLevels
open import Cubical.Foundations.HLevels.More
open import Cubical.Foundations.Isomorphism hiding (isIso)

import Cubical.Data.Equality as Eq
open import Cubical.Data.Sigma
open import Cubical.Data.Sigma.More

open import Cubical.Reflection.RecordEquiv.More

import Cubical.Categories.Category as Small
import Cubical.Categories.Functor as SmallFunctor
open import Cubical.Categories.LocallySmall.Category.Base
open import Cubical.Categories.LocallySmall.Category.Small
import Cubical.Categories.LocallySmall.Functor.Base as LocallySmallF
open import Cubical.Categories.LocallySmall.Variables

open import Cubical.Categories.LocallySmall.Displayed.Category.Base
open import Cubical.Categories.LocallySmall.Displayed.Category.Notation
open import Cubical.Categories.LocallySmall.Displayed.Category.Small
open import Cubical.Categories.LocallySmall.Displayed.Category.Properties
open import Cubical.Categories.LocallySmall.Displayed.Constructions.Reindex.Base
open import Cubical.Categories.LocallySmall.Displayed.Constructions.Reindex.Properties

open Category
open Categoryᴰ
open SmallCategory

module FunctorDefs
  (C : SmallCategory ℓC ℓC')
  {D : Category Dob DHom-ℓ}
  {Dobᴰ-ℓ Dobᴰ DHom-ℓᴰ}
  (Dᴰ : SmallFibersCategoryᴰ D Dobᴰ-ℓ Dobᴰ DHom-ℓᴰ)
  where
  private
    module C = SmallCategory C
    module D = Category D
    module Dᴰ = CategoryᴰNotation Dᴰ

  Functor : (d : Dob)  Typeω
  Functor d = LocallySmallF.Functor C.cat Dᴰ.v[ d ]

  module _ (D-⋆ :  {x}  D.id D.⋆ D.id Eq.≡ D.id {x}) (d : Dob) where
    FunctorEq : Typeω
    FunctorEq = LocallySmallF.Functor C.cat (fibEq Dᴰ D-⋆ d)

    Functor→FunctorEq :
      Functor d  FunctorEq
    Functor→FunctorEq = fib→fibEq Dᴰ D-⋆ d LocallySmallF.∘F_

    FunctorEq→Functor :
      FunctorEq  Functor d
    FunctorEq→Functor = fibEq→fib Dᴰ D-⋆ d LocallySmallF.∘F_

  module FunctorNotation {d : Dob} (F : Functor d)
    where

    open LocallySmallF.FunctorNotation F public