<?php
function showResult($input) {
    print json_encode($input, JSON_UNESCAPED_UNICODE);
    exit();
}
function generateField($config) {
    $output = array();
    for ($i = 0; $i < $config['maxRow'] * $config['maxColumn']; $i++) {
        $output[] = $config['colors'][rand(0, count($config['colors']) - 1)];
    }
    return $output;
}
function saveFieldFile($path, $field) {
    file_put_contents($path, json_encode($field));
}
function loadFieldFile($path) {
    $output = json_decode(file_get_contents($path), true);
    return $output;
}
function cellHandler($raw, $config) {
    $cell = explode('-', $raw);
    $output = array(
        'row' => (int) substr($cell[0], 1),
        'column' => (int) substr($cell[1], 1)
    );
    $error = array(
        'status' => 'error'
    );

    if ($output['row'] < 1) {
        $error['text'] = 'Значение ряда меньше единицы';
        return $error;
    }
    if ($output['row'] > $config['maxRow']) {
        $error['text'] = 'Значение ряда больше допустимого';
        return $error;
    }
    if ($output['column'] < 1) {
        $error['text'] = 'Значение колонки меньше единицы';
        return $error;
    }
    if ($output['column'] > $config['maxColumn']) {
        $error['text'] = 'Значение колонки больше допустимого';
        return $error;
    }

    return $output;
}

session_start();

$config = array(
    'maxRow' => 8,
    'maxColumn' => 8,
    'colors' => array(
        0 => 'red',
        1 => 'orange',
        2 => 'blue',
        3 => 'yellow',
        4 => 'green',
        5 => 'white',
        6 => 'pink',
        7 => 'purple'
    ),
    'path' => 'sessions/'.session_id()
);
$output = array(
    'status' => 'ok'
);
$error = array(
    'status' => 'error'
);

switch ($_POST['f']) {
    case 'cellMovement':
        $cells = $_POST['cells'];
        if (!is_array($cells)) {
            $error['text'] = 'Параметры клеток должны являться массивом';
            showResult($error);
        }
        if (count($cells) > 2) {
            $error['text'] = 'Передано слишком большое количество клеток';
            showResult($error);
        }
        foreach ($cells as $i) {
            $cell = cellHandler($i, $config);
            if (isset($cell['status']) && $cell['status'] == 'ok') {
                showResult($cell);
            }
            $output['cells'][] = $cell;
        }

        if (abs($output['cells'][0]['row'] - $output['cells'][1]['row']) > 1 ||
            abs($output['cells'][0]['column'] - $output['cells'][1]['column']) > 1 ||
            abs($output['cells'][0]['row'] - $output['cells'][1]['row']) - abs($output['cells'][0]['column'] - $output['cells'][1]['column']) == 0) {
            $error['text'] = 'Движение разрешено только между соседними клетками';
            showResult($error);
        }

        $cellsIndexes = array(
            0 => ($output['cells'][0]['row'] - 1) * $config['maxColumn'] + $output['cells'][0]['column'] - 1,
            1 => ($output['cells'][1]['row'] - 1) * $config['maxColumn'] + $output['cells'][1]['column'] - 1
        );
        $field = loadFieldFile($config['path']);
        $tempCell = $field[$cellsIndexes[0]];
        $field[$cellsIndexes[0]] = $field[$cellsIndexes[1]];
        $field[$cellsIndexes[1]] = $tempCell;
        unset($tempCell);
        saveFieldFile($config['path'], $field);

        showResult($output);
    break;

    case 'getField':
        if (!file_exists($config['path'])) {
            $output['field'] = generateField($config);
            saveFieldFile($config['path'], $output['field']);
        } else {
            $output['field'] = loadFieldFile($config['path']);
        }

        showResult($output);
    break;
}

?>
