open import GpdCont.Prelude

open import GpdCont.TwoCategory.Base
open import GpdCont.TwoCategory.StrictFunctor

module GpdCont.TwoCategory.CompositeFunctor
  {ℓo₁ ℓh₁ ℓr₁}
  {ℓo₂ ℓh₂ ℓr₂}
  {ℓo₃ ℓh₃ ℓr₃}
  {C : TwoCategory ℓo₁ ℓh₁ ℓr₁}
  {D : TwoCategory ℓo₂ ℓh₂ ℓr₂}
  {E : TwoCategory ℓo₃ ℓh₃ ℓr₃}
  (F : StrictFunctor C D)
  (G : StrictFunctor D E)
  where
  private
    module C = TwoCategory C
    module F = StrictFunctor F

  open import GpdCont.TwoCategory.StrictFunctor.LocalFunctor
  open import Cubical.Categories.Functor.Base using (Functor)
  open import Cubical.Categories.Functor.Properties using (isFullyFaithfulG∘F)

  isLocallyFullyFaithfulCompositeRestrict :
      isLocallyFullyFaithful F
     (∀ (c₁ c₂ : C.ob)  Functor.isFullyFaithful (LocalFunctor G (F.₀ c₁) (F.₀ c₂)))
     isLocallyFullyFaithful (compStrictFunctor F G)
  isLocallyFullyFaithfulCompositeRestrict F-ff G-ff c₁ c₂ = isFullyFaithfulG∘F
    {F = LocalFunctor F c₁ c₂}
    {G = LocalFunctor G (F.₀ c₁) (F.₀ c₂)}
    (F-ff c₁ c₂)
    (G-ff c₁ c₂)