#pragma once

#include <string>
#include <vector>
#include <tuple>

using std::vector;
using std::tuple;
using std::string;

enum class Axis { X, Y };

using Coordinate = tuple<size_t, size_t>;
using Instruction = tuple<Axis, size_t>;

class Sheet {
private:
    vector<bool> map;
    size_t width = 0;
    size_t height = 0;
    vector<Instruction> instructions;

public:
    Sheet(string path);

    void fold_once();

    void fold_all();

    int count_dots();

    void print();

private:
    void fold(Axis axis, size_t pos);

    void fold_up(size_t pos);

    void fold_left(size_t pos);
};

tuple<vector<Coordinate>, vector<Instruction>> parse_file(string path);