#ifndef BATTLESHIP_H
#define BATTLESHIP_H

#include <stdint.h>
#include <list>
#include <istream>
#include <utility>

#include "Board.h"
#include "Ship.h"
#include "Solution.h"

namespace Battleship{

class Battleship{
public:
    Battleship(const Board& board, Ship*& shipList);
    ~Battleship(){ deleteLinkedShips(shipList); deleteLinkedShips(knownShips); deleteLinkedShips(unknownShips); };

    //Returns true or false if a single solution was found.
    bool findSingleSolution() { resetSearchPosition(); return findSolutions(&mainBoard, shipList, false); };

    //Returns number of solutions.
    uint_fast64_t findAllSolutions() { resetSearchPosition(); return findSolutions(&mainBoard, shipList); };

    void clearSolutions() { solutionStates.clear(); };

    std::list<Solution>& getSolutions() { return solutionStates; };
private:
    uint64_t findSolutions(Board* board, Ship* ships, bool all = true, uint8_t last_size = 0, int j = 0, int i = 0);

    uint64_t checkUnknowns(Board* board, Ship* ships, bool all, uint8_t ship = 7, uint8_t last_size = 0, int x = 0, int y = 0);

    inline void resetSearchPosition()
        { for(int i = 0; i < 7; i++) searchPositions[i][0] = searchPositions[i][1] = 0; }

    Board mainBoard;

    std::list<Solution> solutionStates;

    Ship* shipList;
    Ship* knownShips;
    Ship* unknownShips;

    int searchPositions[7][2];
};

}

#endif // BATTLESHIP_H
