import Mathlib.Analysis.Complex.CauchyIntegral
--import Mathlib.Analysis.Complex.Module
-- test

open ComplexConjugate

#check DiffContOnCl.circleIntegral_sub_inv_smul

open Real

theorem CauchyIntegralFormula :
  ∀
  {R : ℝ} -- Radius of the ball
  {w : ℂ} -- Point in the interior of the ball
  {f : ℂ → ℂ}, -- Holomorphic function
  DiffContOnCl ℂ f (Metric.ball 0 R)
  → w ∈ Metric.ball 0 R
  → (∮ (z : ℂ) in C(0, R), (z - w)⁻¹ • f z) = (2 * π * Complex.I) • f w := by

  exact DiffContOnCl.circleIntegral_sub_inv_smul

#check CauchyIntegralFormula
#check HasDerivAt.continuousAt
#check Real.log
#check ComplexConjugate.conj
#check Complex.exp

theorem SimpleCauchyFormula :
  ∀
  {R : ℝ} -- Radius of the ball
  {w : ℂ} -- Point in the interior of the ball
  {f : ℂ → ℂ}, -- Holomorphic function
  Differentiable ℂ f
  → w ∈ Metric.ball 0 R
  → (∮ (z : ℂ) in C(0, R), (z - w)⁻¹ • f z) = (2 * Real.pi * Complex.I) • f w := by

  intro R w f fHyp

  apply DiffContOnCl.circleIntegral_sub_inv_smul

  constructor
  · exact Differentiable.differentiableOn fHyp
  · suffices Continuous f from by
      exact Continuous.continuousOn this
    rw [continuous_iff_continuousAt]
    intro x
    exact DifferentiableAt.continuousAt (fHyp x)


theorem JensenFormula₂ :
  ∀
  {R : ℝ} -- Radius of the ball
  {f : ℂ → ℂ}, -- Holomorphic function
  Differentiable ℂ f
  → (∀ z ∈ Metric.ball 0 R, f z ≠ 0)
  → (∫ (θ : ℝ) in Set.Icc 0 (2 * π), Complex.log ‖f (circleMap 0 R θ)‖ ) = 2 * π * Complex.log ‖f 0‖ := by

  intro r f fHyp₁ fHyp₂

  /- We treat the trivial case r = 0 separately. -/
  by_cases rHyp : r = 0
  rw [rHyp]
  simp
  left
  unfold ENNReal.ofReal
  simp
  rw [max_eq_left (mul_nonneg zero_le_two pi_nonneg)]
  simp
  /- From hereon, we assume that r ≠ 0. -/

  /- Replace the integral over 0 … 2π by a circle integral -/
  suffices (∮ (z : ℂ) in C(0, r), -(Complex.I * z⁻¹ * Complex.log ↑(Complex.abs (f z)))) = 2 * ↑π * Complex.log ↑‖f 0‖ from by
    have : ∫ (θ : ℝ) in Set.Icc 0 (2 * π), Complex.log ↑‖f (circleMap 0 r θ)‖ = (∮ (z : ℂ) in C(0, r), -(Complex.I * z⁻¹ * Complex.log ↑(Complex.abs (f z)))) := by
      have : (fun θ ↦ Complex.log ‖f (circleMap 0 r θ)‖) = (fun θ ↦ ((deriv (circleMap 0 r) θ)) • ((deriv (circleMap 0 r) θ)⁻¹ • Complex.log ↑‖f (circleMap 0 r θ)‖)) := by
        funext θ
        rw [← smul_assoc, smul_eq_mul, smul_eq_mul, mul_inv_cancel, one_mul]
        simp
        exact rHyp
      rw [this]
      simp
      let tmp := circleIntegral_def_Icc (fun z ↦ -(Complex.I * z⁻¹ * (Complex.log ↑‖f z‖))) 0 r
      simp at tmp
      rw [← tmp]
    rw [this]



  have : ∀ z : ℂ, log (Complex.abs z) = 1/2 * Complex.log z + 1/2 * Complex.log (conj z) := by
    intro z

    by_cases argHyp : Complex.arg z = π

    · rw [Complex.log, argHyp, Complex.log]
      let ZZ := Complex.arg_conj z
      rw [argHyp] at ZZ

      simp at ZZ

      have : conj z = z := by
        apply?
        sorry

    let ZZ := Complex.log_conj z

    nth_rewrite 1 [Complex.log]

    simp

    let φ := Complex.arg z
    let r := Complex.abs z
    have : z = r * Complex.exp (φ * Complex.I) := by
      exact (Complex.abs_mul_exp_arg_mul_I z).symm

    have : Complex.log z = Complex.log r + r*Complex.I := by
      apply?
      sorry
    simp at XX


    sorry









  sorry
