#pragma once
#include "misn_lua.h"

/* Availability by location. */
#define MIS_AVAIL_NONE        0
#define MIS_AVAIL_COMPUTER    1
#define MIS_AVAIL_BAR         2
#define MIS_AVAIL_OUTFIT      3
#define MIS_AVAIL_SHIPYARD    4
#define MIS_AVAIL_LAND        5
#define MIS_AVAIL_COMMODITY   6 /**< Mission is available at commodity exchange. */

/* Flags. */
#define mis_isFlag(m,f)   ((m)->flags  & (f))
#define mis_setFlag(m,f)  ((m)->flags |= (f))
#define mis_rmFlag(m,f)   ((m)->flags ^= (f))

#define MISSION_UNIQUE        1 /* Unique missions can't be repeated. */

/* Static mission data. */
typedef struct MissionData_ {
  char* name; /* the name of the mission. */

  /* Availability. */
  struct {
    int loc;      /* Location. */
    int chance;   /* Chance of it appearing. */

    /* For specific cases. */
    char* planet;
    char* system;

    /* For generic cases. */
    int* factions;
    int nfactions;

    char* cond;   /* Conditional that must be met. */
    char* done;   /* Previous mission that must have been done. */
  } avail;

  unsigned int flags; /* Flags to store binary properties. */

  char* lua;
} MissionData;

/* Active mission. */
typedef struct Mission_ {
  MissionData* data;
  /* Unique mission identifier, used for keeping track of hooks. */
  unsigned int id;

  char* title;  /* Not to be confused with name.. */
  char* desc;   /* Description of the mission. */
  char* reward; /* Rewards - in text. */

  /* Mission cargo give to the player - Need to cleanup. */
  unsigned int* cargo;
  int ncargo;

  char* sys_marker; /* Marked system. */

  lua_State* L; /* The state of the running lua code. */
} Mission;

#define MISSION_MAX 6 /* No sense in the player having unlimited missions.. */
extern Mission player_missions[MISSION_MAX];

/* For mission computer. */
Mission* missions_computer(int* n, int faction, char* planet, char* sysname);
/* Player accepted mission - mission computer. */
int mission_accept(Mission* mission);
void missions_bar(int faction, char* planet, char* sysname);

/* Misc. */
int mission_getID(char* name);
MissionData* mission_get(int id);
void mission_sysMark(void);

/* Cargo stuff. */
void mission_linkCargo(Mission* misn, unsigned int cargo_id);
void mission_unlinkCargo(Mission* misn, unsigned int cargo_id);

/* Load/Quit. */
int missions_load(void);
void mission_cleanup(Mission* misn);
void missions_free(void);
void missions_cleanup(void);