#ifndef ADD_PATCH_H
#define ADD_PATCH_H

#include "color.h"

struct index_state;
struct pathspec;
struct repository;

struct interactive_options {
	int context;
	int interhunkcontext;
	int auto_advance;
};

#define INTERACTIVE_OPTIONS_INIT { \
	.context = -1, \
	.interhunkcontext = -1, \
	.auto_advance = 1, \
}

struct interactive_config {
	enum git_colorbool use_color_interactive;
	enum git_colorbool use_color_diff;
	char header_color[COLOR_MAXLEN];
	char help_color[COLOR_MAXLEN];
	char prompt_color[COLOR_MAXLEN];
	char error_color[COLOR_MAXLEN];
	char reset_color_interactive[COLOR_MAXLEN];

	char fraginfo_color[COLOR_MAXLEN];
	char context_color[COLOR_MAXLEN];
	char file_old_color[COLOR_MAXLEN];
	char file_new_color[COLOR_MAXLEN];
	char reset_color_diff[COLOR_MAXLEN];

	int use_single_key;
	char *interactive_diff_filter, *interactive_diff_algorithm;
	int context, interhunkcontext;
	int auto_advance;
};

void interactive_config_init(struct interactive_config *cfg,
			     struct repository *r,
			     struct interactive_options *opts);
void interactive_config_clear(struct interactive_config *cfg);

enum add_p_mode {
	ADD_P_ADD,
	ADD_P_STASH,
	ADD_P_RESET,
	ADD_P_CHECKOUT,
	ADD_P_WORKTREE,
};

enum add_p_flags {
	/* Disallow "editing" hunks. */
	ADD_P_DISALLOW_EDIT = (1 << 0),
};

int run_add_p(struct repository *r, enum add_p_mode mode,
	      struct interactive_options *opts, const char *revision,
	      const struct pathspec *ps,
	      unsigned flags);

int run_add_p_index(struct repository *r,
		    struct index_state *index,
		    const char *index_file,
		    struct interactive_options *opts,
		    const char *revision,
		    const struct pathspec *ps,
		    unsigned flags);

#endif
