module GpdCont.GroupAction.Equivariant where

open import GpdCont.Prelude
open import GpdCont.GroupAction.Base

open import Cubical.Algebra.Group.Base
open import Cubical.Algebra.Group.Morphisms using (GroupHom)
open import Cubical.Algebra.Group.MorphismProperties using (compGroupHom ; idGroupHom)
open import Cubical.Foundations.HLevels

private
  variable
     : Level
    G H K : Group 
    X Y Z : hSet 
    σ : Action G X
    τ : Action H Y

open Action

private
  Grp×Setᵒᵖ[_,_] : (G×X H×Y : Group  × hSet )  Type 
  Grp×Setᵒᵖ[ (G , X) , (H , Y) ] = GroupHom G H × ( Y    X )
  {-# INJECTIVE_FOR_INFERENCE Grp×Setᵒᵖ[_,_] #-}

  compGrp×Setᵒᵖ :  {G H K : Group } {X Y Z : hSet }
     Grp×Setᵒᵖ[ (G , X) , (H , Y) ]
     Grp×Setᵒᵖ[ (H , Y) , (K , Z) ]
     Grp×Setᵒᵖ[ (G , X) , (K , Z) ]
  compGrp×Setᵒᵖ (φ , fᵒᵖ) (ψ , gᵒᵖ) .fst = compGroupHom φ ψ
  compGrp×Setᵒᵖ (φ , fᵒᵖ) (ψ , gᵒᵖ) .snd = fᵒᵖ  gᵒᵖ

isEquivariantMap[_][_,_] :
  (φ×fᵒᵖ : Grp×Setᵒᵖ[ (G , X) , (H , Y) ])
   Action G X  Action H Y  Type _
isEquivariantMap[ (φ , _) , fᵒᵖ ][ σ , τ ] =  g  (σ  g)  fᵒᵖ  fᵒᵖ  (τ  φ g)

{-# INJECTIVE_FOR_INFERENCE isEquivariantMap[_][_,_] #-}

opaque
  isPropIsEquivariantMap : (φ×fᵒᵖ : Grp×Setᵒᵖ[ (G , X) , (H , Y) ])
     (σ : Action G X)
     (τ : Action H Y)
     isProp (isEquivariantMap[ φ×fᵒᵖ ][ σ , τ ])
  isPropIsEquivariantMap {X = X} _ _ _ = isPropΠ λ g  isSet→ (str X) _ _

opaque
  isEquivariantMap-comp :
     (φ×f : Grp×Setᵒᵖ[ (G , X) , (H , Y) ])
     (ψ×p : Grp×Setᵒᵖ[ (H , Y) , (K , Z) ])
     (σ : Action G X) (τ : Action H Y) (υ : Action K Z)
     isEquivariantMap[ φ×f ][ σ , τ ]
     isEquivariantMap[ ψ×p ][ τ , υ ]
     isEquivariantMap[ compGrp×Setᵒᵖ {X = X} {Y = Y} {Z = Z} φ×f ψ×p ][ σ , υ ]
  isEquivariantMap-comp ((φ , _) , f) ((ψ , _) , p) σ τ υ f-eqva p-eqva g =
    (σ  g)  f  p ≡⟨ cong (_∘ p) (f-eqva g) 
    f  (τ  (φ g))  p ≡⟨ cong (f ∘_) (p-eqva (φ g)) 
    f  p  (υ  (ψ (φ g))) 

isEquivariantMap-id :  (σ : Action G X)  isEquivariantMap[ idGroupHom {G = G} , (id  X ) ][ σ , σ ]
isEquivariantMap-id σ = λ g  refl