importPackage(java.awt);
importPackage(java.awt.geom);
include(Resources.id('mtrsteamloco:scripts/display_helper.js'));

let slotHeadDestCfg = {								// ЭМУ ОСНОВНОЙ ГОЛОВНОЙ (БЕЛЫЕ ОГНИ) ВАГОН
    version: 1,
    texSize: [1024, 128],
    slots: [
        {
            name: 'head-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-0.6401, 2.1641, 10.2903],		// Левый Верхний Угол XYZ
                    [-0.6401, 1.9655, 10.2903],	// Левый Нижний Угол XYZ
                    [0.6401, 1.9655, 10.2903],		// Правый Нижний Угол XYZ
                    [0.6401, 2.1641, 10.2903],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let slotHeadRouteCfg = {							// ЭМУ МАРШРУТ ГОЛОВНОЙ (БЕЛЫЕ ОГНИ) ВАГОН
    version: 1,
    texSize: [256, 128],
    slots: [
        {
            name: 'head-route',
            texArea: [0, 0, 256, 128],
            pos: [
                [
                    [0, 0, 0],		// Левый Верхний Угол XYZ
                    [0, 0, 0],		// Левый Нижний Угол XYZ
                    [0, 0, 0],	    // Правый Нижний Угол XYZ
                    [0, 0, 0],	    // Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let slotTailDestCfg = {							    // ЭМУ ОСНОВНОЙ ХВОСТОВОЙ (КРАСНЫЕ ОГНИ) ВАГОН
    version: 1,
    texSize: [1024, 128],
    slots: [
        {
            name: 'tail-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [0.6401, 2.1641, -10.2903],     // Левый Верхний Угол XYZ
                    [0.6401, 1.9655, -10.2903], // Левый Нижний Угол XYZ
                    [-0.6401, 1.9655, -10.2903],      // Правый Нижний Угол XYZ
                    [-0.6401, 2.1641, -10.2903],      // Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let slotTailRouteCfg = {						    // ЭМУ МАРШРУТ ХВОСТОВОЙ (КРАСНЫЕ ОГНИ) ВАГОН
    version: 1,
    texSize: [256, 128],
    slots: [
        {
            name: 'tail-route',
            texArea: [0, 0, 256, 128],
            pos: [
                [
                    [0, 0, 0],     // Левый Верхний Угол XYZ
                    [0, 0, 0],     // Левый Нижний Угол XYZ
                    [0, 0, 0],     // Правый Нижний Угол XYZ
                    [0, 0, 0],     // Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let dhHeadBaseDest = new DisplayHelper(slotHeadDestCfg);
let dhHeadBaseRoute = new DisplayHelper(slotHeadRouteCfg);
let dhTailBaseDest = new DisplayHelper(slotTailDestCfg);
let dhTailBaseRoute = new DisplayHelper(slotTailRouteCfg);

function create(ctx, state, train) {                                        // Генератор номера маршрута
    state.pisRateLimit = new RateLimit(0.05);
    state.dhHeadDest = dhHeadBaseDest.create();
    state.dhHeadRoute = dhHeadBaseRoute.create();
    state.dhTailDest = dhTailBaseDest.create();
    state.dhTailRoute = dhTailBaseRoute.create();
    state.routeIDmath = Math.floor(1 + (Math.random() * 59));			            // Генерация рандомного номера маршрута (От 1 до 30 включительно)
    return (state.routeID = state.routeIDmath);
}

function dispose(ctx, state, train) {                                       // В душе не ебу что это но это важно
    state.dhHeadDest.close();
    state.dhHeadRoute.close();
    state.dhTailDest.close();
    state.dhTailRoute.close();
}
var EMUFont = Resources.readFont(                                           // Шрифт ЭМУ
    Resources.idRelative('mtr:fronts/timessquare.ttf')
);

function render(ctx, state, train) {                                        // Рендер ЭМУ
    if (state.pisRateLimit.shouldUpdate()) {
        let g;

        let EMUText = getDestinationStation(train);

        [																	    // Вывод конечной станции на ЭМУ
            { dh: state.dhHeadDest, graphicsName: 'head-dest' },
            { dh: state.dhTailDest, graphicsName: 'tail-dest' },
        ].forEach((element) => {
            let dh = element.dh;
            g = dh.graphicsFor(element.graphicsName);
            g.setColor(Color.BLACK);									            // Цвет заднего фона
            g.fillRect(0, 0, 1024, 128);								                // Площадь заливки заднего фона
            g.setColor(Color.ORANGE); 									            // Цвет текста
            g.setFont(EMUFont.deriveFont(Font.PLAIN, 120)); 			            // Размер шрифта
            let fontMetrics = g.getFontMetrics();
            let textWidth = fontMetrics.stringWidth(EMUText);
            g.drawString(EMUText, (1024 - textWidth) / 2, 115);                     // Формула для вывода на экран
            dh.upload();
        }),
		
		[																	    // Вывод номера маршрута на ЭМУ
            { dh: state.dhHeadRoute, graphicsName: 'head-route' },
            { dh: state.dhTailRoute, graphicsName: 'tail-route' },
        ].forEach((element) => {
            let dh = element.dh;
            g = dh.graphicsFor(element.graphicsName);
            g.setColor(Color.BLACK);									            // Цвет заднего фона
            g.fillRect(0, 0, 256, 128);								                    // Площадь заливки заднего фона
            g.setColor(Color.GREEN); 									            // Цвет текста
            g.setFont(EMUFont.deriveFont(Font.PLAIN, 110)); 			            // Размер шрифта
            g.drawString(state.routeID, 45, 115);                                   // Формула для вывода на экран
            dh.upload();
        });
    }

    ctx.drawCarModel(state.dhHeadDest.model, 0, null);
    ctx.drawCarModel(state.dhHeadRoute.model, 0, null);
    ctx.drawCarModel(state.dhTailDest.model, train.trainCars() - 1, null);
    ctx.drawCarModel(state.dhTailRoute.model, train.trainCars() - 1, null);
}

function getDestinationStation(train) {                                     // Получение данных о конечной станции
    let stationList = train.getThisRoutePlatforms();
    let lastPlatform = stationList[stationList.size() - 1];
    if (lastPlatform === undefined) return 'NICHT EINSTEIGEN';					    // Выводимая на ЭМУ надпись в отсутствии конечной станции (При возврате/в Депо)
    return lastPlatform.destinationName.split('\\|')[0];
}
