import Mathlib.Analysis.Complex.Basic
import Mathlib.Analysis.Complex.TaylorSeries
import Mathlib.Analysis.Calculus.LineDeriv.Basic
import Mathlib.Analysis.Calculus.ContDiff.Defs
import Mathlib.Analysis.Calculus.FDeriv.Basic
import Nevanlinna.cauchyRiemann

noncomputable def Complex.laplace : (ℂ → ℝ) → (ℂ → ℝ) := by
  intro f
  let f₁ := fun x ↦ lineDeriv ℝ f x 1
  let f₁₁ := fun x ↦ lineDeriv ℝ f₁ x 1
  let f₂ := fun x ↦ lineDeriv ℝ f x Complex.I
  let f₂₂ := fun x ↦ lineDeriv ℝ f₂ x Complex.I
  exact f₁₁ + f₂₂


def Harmonic (f : ℂ → ℝ) : Prop :=
  (ContDiff ℝ 2 f) ∧ (∀ z, Complex.laplace f z = 0)


theorem re_comp_holomorphic_is_harmonic (f : ℂ → ℂ) :
  Differentiable ℂ f → Harmonic (Complex.reCLM ∘ f) := by

  intro h

  constructor
  · -- Complex.reCLM ∘ f is two times real continuously differentiable
    apply ContDiff.comp
    · -- Complex.reCLM is two times real continuously differentiable
      exact ContinuousLinearMap.contDiff Complex.reCLM
    · -- f is two times real continuously differentiable
      exact ContDiff.restrict_scalars ℝ (Differentiable.contDiff h)

  · -- Laplace of f is zero
    intro z
    unfold Complex.laplace
    simp
    let ZZ := (CauchyRiemann₃ (h z)).left

    sorry
