// MoonBit Photonics Library - Main Benchmark & Interactive Application
// Copyright 2026 wyhjjkk. Apache-2.0 License.

///|
fn main {
  println(
    "=========================================================================",
  )
  println(
    "        MoonBit Photonics Library (moonbit-photonics v0.1.0)             ",
  )
  println(
    "  High-Performance Transfer Matrix Method (TMM) & Photonic Suite         ",
  )
  println(
    "=========================================================================\n",
  )

  let air = @layer.Medium::air()
  let bk7 = @layer.Medium::bk7()

  println("--> [1] Analyzing Distributed Bragg Reflector (DBR) Mirror Stack...")
  let high_n = @layer.Medium::new(
    "TiO2",
    @dispersion.DispersionModel::constant_real(2.3),
  )
  let low_n = @layer.Medium::new(
    "SiO2",
    @dispersion.DispersionModel::constant_real(1.45),
  )

  let dbr_cfg = @structures.DbrConfig::{
    high_medium: high_n,
    low_medium: low_n,
    center_lambda_nm: 632.8,
    num_pairs: 10,
  }

  let dbr_analysis = @structures.analyze_dbr(dbr_cfg, air, bk7)
  println("    DBR Center Wavelength: \{dbr_analysis.center_lambda_nm} nm")
  println(
    "    Analytical Peak Reflectance R_max: \{dbr_analysis.peak_reflectance_analytical}",
  )
  println(
    "    Stopband Width (FWHM): \{dbr_analysis.stopband_width_nm} nm [\{dbr_analysis.lambda_min_nm} nm - \{dbr_analysis.lambda_max_nm} nm]",
  )

  let dbr_tmm = @core_tmm.solve_tmm(dbr_analysis.stack, 632.8, 0.0, TE)
  println("    Numerical TMM Reflectance at 632.8nm: \{dbr_tmm.reflectance}\n")

  println("--> [2] Analyzing Fabry-Pérot Cavity Resonator...")
  let dbr_small_cfg = @structures.DbrConfig::{
    high_medium: high_n,
    low_medium: low_n,
    center_lambda_nm: 600.0,
    num_pairs: 6,
  }
  let fp_cfg = @structures.FabryPerotConfig::{
    left_dbr: dbr_small_cfg,
    right_dbr: dbr_small_cfg,
    cavity_medium: low_n,
    cavity_order: 1,
    center_lambda_nm: 600.0,
  }

  let fp_analysis = @structures.analyze_fp_cavity(fp_cfg, air, bk7)
  println("    Cavity Thickness: \{fp_analysis.cavity_thickness_nm} nm")
  println(
    "    Resonance Peak Wavelength: \{fp_analysis.resonance_lambda_nm} nm",
  )
  println("    FWHM: \{fp_analysis.fwhm_nm} nm")
  println("    Cavity Quality Factor (Q): \{fp_analysis.q_factor}")
  println("    Cavity Finesse (F): \{fp_analysis.finesse}\n")

  println("--> [3] Analyzing Surface Plasmon Resonance (SPR) Sensor...")
  let sf11 = @layer.Medium::new(
    "SF11",
    @dispersion.DispersionModel::constant_real(1.78),
  )
  let gold = @layer.Medium::gold()
  let metal_layer = @layer.Layer::new(gold, 45.0)
  let water = @layer.Medium::new(
    "Water",
    @dispersion.DispersionModel::constant_real(1.33),
  )
  let spr_res = @structures.analyze_spr_sensor(sf11, metal_layer, water, 632.8)
  println("    SPR Resonance Angle: \{spr_res.spr_angle_deg} deg")
  println("    Sensitivity: \{spr_res.sensitivity_deg_per_riu} deg/RIU")
  println("    Figure of Merit (FOM): \{spr_res.figure_of_merit}\n")

  println(
    "--> [4] Executing Wavelength Spectrum Parameter Sweep (400 - 800 nm)...",
  )
  let sweep_cfg = @sweep.SpectrumSweepConfig::{
    start_lambda_nm: 400.0,
    end_lambda_nm: 800.0,
    steps: 100,
    angle_deg: 0.0,
    polarization: TE,
  }
  let sweep_res = @sweep.sweep_spectrum(dbr_analysis.stack, sweep_cfg)
  println("    Sweep Samples: \{sweep_res.lambdas_nm.length()} points")
  println(
    "    Maximum Measured Reflection: \{sweep_res.max_reflectance} @ \{sweep_res.max_reflectance_lambda} nm",
  )
  println(
    "    Minimum Measured Transmission: \{sweep_res.min_transmittance} @ \{sweep_res.min_transmittance_lambda} nm\n",
  )

  println("--> [5] Running Reproducible Experiment Quality Gates...")
  let workflow_config = @workflow.WorkflowConfig::{
    sweep_config: sweep_cfg,
    minimum_samples: 50,
    energy_tolerance: 0.000001,
    minimum_peak_reflectance: 0.90,
    maximum_transmittance: 1.000001,
  }
  let workflow_report = @workflow.run_experiment(
    dbr_analysis.stack,
    workflow_config,
  )
  let diagnostics = @workflow.failed_check_names(workflow_report)
  println("    Quality Gates Passed: \{workflow_report.passed}")
  println("    Maximum Energy Error: \{workflow_report.max_energy_error}")
  println("    Failed Gates: \{diagnostics.length()}")

  println("--> [6] Running Bounded Thickness Optimization...")
  let optimization = @optimization.optimize_thickness(dbr_analysis.stack, @optimization.ThicknessOptimizationConfig::{
    wavelength_nm: 632.8,
    angle_deg: 0.0,
    polarization: TE,
    parameters: [
      @optimization.ThicknessParameter::{
        layer_index: 0,
        lower_nm: 45.0,
        upper_nm: 95.0,
        step_nm: 10.0,
      },
    ],
    objective: @optimization.maximize_reflectance_at(632.8),
    max_iterations: 2,
    max_evaluations: 16,
    tolerance: 0.0000001,
  })
  println("    Evaluations: \{optimization.evaluations}")
  println("    Initial Score: \{optimization.initial_score}")
  println("    Final Score: \{optimization.final_score}")

  let benchmark = @workflow.run_benchmark(dbr_analysis.stack, @workflow.BenchmarkConfig::{
    repeats: 3,
    start_lambda_nm: 500.0,
    end_lambda_nm: 700.0,
    steps: 40,
  })
  println(
    "    Benchmark Workload: \{benchmark.repeats} repeats x \{benchmark.samples_per_repeat} samples",
  )
  println("    Benchmark Checksum: \{benchmark.total_checksum}")

  let experiment_validation = @validation.validate_experiment(
    dbr_analysis.stack,
    workflow_report.sweep,
    @validation.default_validation_policy(),
  )
  println(
    "    Validation Status: \{experiment_validation.valid} (errors=\{experiment_validation.errors}, warnings=\{experiment_validation.warnings})\n",
  )

  println(
    "--> [7] Running Monte Carlo Fabrication Tolerance Yield Simulation...",
  )
  let mc_res = @sweep.run_monte_carlo_yield(
    dbr_analysis.stack,
    632.8,
    2.0,
    100,
    0.99,
  )
  println("    Simulated Trials: \{mc_res.trials}")
  println("    Mean Reflectance: \{mc_res.mean_reflectance}")
  println("    Standard Deviation: \{mc_res.std_dev_reflectance}")
  println(
    "    Yield Pass Rate (R >= 0.99): \{mc_res.yield_pass_rate * 100.0}%\n",
  )

  println("--> [8] Generating Vector SVG Spectral Plot...")
  let svg_markup = @export.generate_spectrum_svg(
    sweep_res,
    title="DBR 10-Pair Mirror Spectrum",
  )
  println("    SVG Chart Generated (\{svg_markup.length()} characters)\n")

  println("--> [9] Generating Markdown Technical Report...")
  let md_report = @export.generate_markdown_report(
    dbr_analysis.stack,
    sweep_res,
    title="DBR Photonic Crystal Filter Benchmark",
  )
  println("    Markdown Report Rendered (\{md_report.length()} characters)\n")

  println("--> [10] Generating Interactive HTML Visual Dashboard...")
  let html_dashboard = @export.generate_html_dashboard(
    dbr_analysis.stack,
    sweep_res,
    title="DBR Photonic Filter Interactive Dashboard",
  )
  println(
    "    HTML Dashboard Rendered (\{html_dashboard.length()} characters)\n",
  )

  println(
    "=========================================================================",
  )
  println(
    "    moonbit-photonics TMM Simulation Completed Successfully!            ",
  )
  println(
    "=========================================================================",
  )
}