{ lib, config, ... }:

let
  inherit (lib.nix2lua) return lambda0 pipe1 require call;

  reqCodeCompanionAdapters = require "codecompanion.adapters";

  mkOllamaAdapter = data:
    lambda0
      (return (pipe1
        reqCodeCompanionAdapters
        (call "extend" [ "ollama" data ])
      ));

  adapters = {
    mistral = mkOllamaAdapter {
      name = "mistral";
      schema = {
        model.default = "mistral:7b";
        num_ctx.default = 16384;
        num_predict.default = -1;
      };
    };
    codellama = mkOllamaAdapter {
      name = "codellama";
      schema = {
        model.default = "codellama:7b";
        num_ctx.default = 16384;
        num_predict.default = -1;
      };
    };
  };
in
{
  # dependencies
  plugin.plenary-nvim = { };

  plugin.codecompanion-nvim = {
    enable = true;
    name = "codecompanion";
    setupSettings = {
      inherit adapters;
      strategies = {
        chat.adapter = "mistral";
        inline.adapter = "codellama";
        cmd.adapter = "codellama";
      };
    };
  };

  plugin.nvim-cmp.setupSettings = lib.mkIf config.plugins.nvim-cmp.enable {
    sources = {
      per_filetype.codecompanion = [ "codecompanion" ];
    };
  };
}