import { allRules } from '../rules/index.js';
import { allSymbols } from '../symbols/index.js';
/**
 * Base class that all solvers must extend.
 */
export default class Solver {
    /**
     * Check if the solver supports the current browser environment. This method is called once when the user first clicks
     * the "Solve" button, and the result is cached for the duration of the editor session.
     *
     * The `solve` method will not be called if this method returns `false`, and a message will be displayed to the user
     * indicating that the solver is not supported.
     *
     * @returns A promise that resolves to `true` if the environment is supported, or `false` otherwise.
     */
    isEnvironmentSupported() {
        return Promise.resolve(true);
    }
    /**
     * Check if the solver supports the given instruction. This is used to render a small indication in the UI for each
     * instruction in the editor.
     *
     * @param instructionId The unique identifier of the instruction.
     */
    isInstructionSupported(instructionId) {
        const symbol = allSymbols.get(instructionId);
        if (symbol) {
            return !symbol.validateWithSolution;
        }
        const rule = allRules.get(instructionId);
        if (rule) {
            return !rule.validateWithSolution;
        }
        return false;
    }
    /**
     * Check if the solver supports the given grid. This methid is frequently called when the user changes the grid, and
     * the result is used to enable or disable the "Solve" button.
     *
     * The `solve` method will not be called if this method returns `false`, and a message will be displayed to the user
     * indicating that the grid is not supported by this solver.
     *
     * @param grid The grid to check.
     * @returns `true` if the grid is supported, or `false` otherwise.
     */
    isGridSupported(grid) {
        if (grid.rules.some(rule => rule.necessaryForCompletion && !this.isInstructionSupported(rule.id))) {
            return false;
        }
        if ([...grid.symbols.keys()].some(id => !this.isInstructionSupported(id))) {
            return false;
        }
        return true;
    }
}
