#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

// 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;
  } 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.

  lua_State* L;
} 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* system);
// Player accepted mission - mission computer.
void mission_accept(Mission* mission);
void mission_bar(int faction, char* planet, char* system);

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