#ifndef CORE_ARRAY_H
#define CORE_ARRAY_H

#include "utils/ArrayString.h"

namespace Core {
    template<typename T, int N>
    class Array final {
        static_assert(N > 0, "Array size must be positive");
        T data[static_cast<unsigned int>(N)];

    public:
        Array() = default;

        Array(const T& t) {
            fill(t);
        }

        void fill(const T& t) {
            for(int i = 0; i < N; i++) {
                data[i] = t;
            }
        }

        T& operator[](int index) {
            return data[index];
        }

        const T& operator[](int index) const {
            return data[index];
        }

        T* begin() {
            return data;
        }

        T* end() {
            return data + N;
        }

        const T* begin() const {
            return data;
        }

        const T* end() const {
            return data + N;
        }

        constexpr int getLength() const {
            return N;
        }

        // returns true on error and calls the error callback
        template<int L>
        check_return bool toString(ArrayString<L>& s) const {
            if(s.append("[")) {
                return true;
            }
            for(int i = 0; i < N - 1; i++) {
                if(s.append(data[i]) || s.append(", ")) {
                    return true;
                }
            }
            if(N > 0 && s.append(data[N - 1])) {
                return true;
            }
            return s.append("]");
        }
    };
}

#endif