mix.exs

defmodule Framework.MixProject do
  use Mix.Project

  @version "0.4.12"
  @source_url "https://github.com/your-org/framework"

  def project do
    [
      app: :framework,
      version: @version,
      elixir: "~> 1.18",
      start_permanent: Mix.env() == :prod,
      deps: deps(),

      # Hex metadata
      description:
        "Production-ready Elixir framework with type-safe navigation, event-driven architecture, and comprehensive observability",
      package: package(),

      # Documentation
      name: "Framework",
      source_url: @source_url,
      docs: docs(),

      # Testing
      test_coverage: [tool: ExCoveralls],
      preferred_cli_env: [
        coveralls: :test,
        "coveralls.detail": :test,
        "coveralls.post": :test,
        "coveralls.html": :test
      ],

      # Dialyzer configuration
      dialyzer: [
        # Exclude dev-time Credo rules from analysis (API version conflicts)
        ignore_warnings: ".dialyzer_ignore.exs",
        plt_add_apps: [:mix]
      ]
    ]
  end

  def application do
    [
      extra_applications: [:logger, :crypto, :ssl, :inets, :swoosh],
      mod: {Framework.Application, []}
    ]
  end

  defp deps do
    [
      # Core dependencies - Data & transactions
      {:ecto, "~> 3.11"},
      {:ecto_sql, "~> 3.11"},
      {:postgrex, "~> 0.18"},
      {:ecto_psql_extras, "~> 0.7"},

      # Effects & external I/O
      {:oban, "~> 2.17"},
      {:req, "~> 0.5"},
      {:finch, "~> 0.18"},
      {:swoosh, "~> 1.16"},

      # Events, contracts & APIs
      {:jason, "~> 1.4"},
      {:ex_json_schema, "~> 0.10"},
      {:protox, "~> 1.7"},
      {:grpcbox, "~> 0.17"},
      {:open_api_spex, "~> 3.6"},
      {:phoenix_pubsub, "~> 2.1"},

      # Observability
      {:telemetry, "~> 1.0"},
      {:opentelemetry, "~> 1.4"},
      {:opentelemetry_exporter, "~> 1.7"},
      {:opentelemetry_phoenix, "~> 1.2"},
      {:opentelemetry_ecto, "~> 1.2"},
      {:opentelemetry_oban, "~> 1.0"},
      {:logger_json, "~> 6.0"},

      # Configuration & validation
      {:nimble_options, "~> 1.1"},

      # Development & testing dependencies
      {:credo, "~> 1.7", only: [:dev, :test], runtime: false},
      {:sobelow, "~> 0.13", only: [:dev, :test], runtime: false},
      {:dialyxir, "~> 1.4", only: [:dev], runtime: false},
      {:ex_doc, "~> 0.31", only: :dev, runtime: false},
      {:mox, "~> 1.1", only: :test},
      {:bypass, "~> 2.1", only: :test},
      {:stream_data, "~> 1.0", only: [:dev, :test]},
      {:excoveralls, "~> 0.18", only: [:dev, :test]},
      {:mix_test_watch, "~> 1.0", only: [:dev, :test], runtime: false}
    ]
  end

  defp package do
    [
      maintainers: ["Framework Team"],
      licenses: ["MIT"],
      links: %{"GitHub" => @source_url},
      files: [
        "lib",
        "priv",
        "ci",
        "mix.exs",
        "CHANGELOG.md",
        "LICENSE"
      ]
    ]
  end

  defp docs do
    [
      main: "Framework",
      source_ref: "v#{@version}",
      source_url: @source_url,
      extras: ["CHANGELOG.md"],
      groups_for_modules: [
        Core: [
          Framework,
          Framework.Kernel,
          Framework.Transaction,
          Framework.Sequencer
        ],
        "Effects & I/O": [
          Framework.Effects,
          Framework.Effects.Worker
        ],
        "Navigation & Security": [
          Framework.AppSpec,
          Framework.VerifiedRoutes,
          Framework.MessageSecurity
        ],
        "Data Layer": [
          Framework.SchemaRegistry,
          Framework.ConsumerCursor
        ],
        Observability: [
          Framework.Telemetry,
          Framework.ValidationMetrics,
          Framework.OverlayController,
          Framework.OverlayRouter
        ],
        "Overlay Tools": [
          Framework.Overlay.Timeline,
          Framework.Overlay.OutboxBrowser,
          Framework.Overlay.DLQBrowser,
          Framework.Overlay.ReplayHarness,
          Framework.Overlay.GatedExport,
          Framework.Overlay.SupersedenceVisualizer,
          Framework.Overlay.RedactionService,
          Framework.Overlay.StructuredLogger
        ],
        "Code Quality": [
          Framework.Credo.Rules.NoRawRoutes,
          Framework.Credo.Rules.NoDirectNavigation,
          Framework.Credo.Rules.NoStringUrls,
          Framework.Credo.Rules.NoIOInPlan,
          Framework.Credo.Rules.NoRepoInPlan,
          Framework.Credo.Rules.NoTimeInPlan,
          Framework.Credo.Rules.NoRngInPlan,
          Framework.Credo.Rules.NoIsolationOverride,
          Framework.Credo.Rules.RequireOnConflict,
          Framework.Credo.Rules.RequireBoundedList,
          Framework.Credo.Rules.NoUpdateAll
        ],
        "Mix Tasks": [
          Mix.Tasks.Framework.Gen.Migrations
        ]
      ]
    ]
  end
end