<?php

use Engelsystem\Models\Room;
use Engelsystem\ShiftsFilter;
use Engelsystem\ShiftsFilterRenderer;

/**
 * Room controllers for managing everything room related.
 */

/**
 * View a room with its shifts.
 *
 * @return array
 */
function room_controller(): array
{
    if (!auth()->can('view_rooms')) {
        throw_redirect(page_link_to());
    }

    $request = request();
    $room = load_room();

    $all_shifts = Shifts_by_room($room);
    $days = [];
    foreach ($all_shifts as $shift) {
        $day = date('Y-m-d', $shift['start']);
        if (!in_array($day, $days)) {
            $days[] = $day;
        }
    }

    $shiftsFilter = new ShiftsFilter(
        true,
        [$room->id],
        AngelType_ids()
    );
    $selected_day = date('Y-m-d');
    if (!empty($days) && !in_array($selected_day, $days)) {
        $selected_day = $days[0];
    }
    if ($request->has('shifts_filter_day')) {
        $selected_day = $request->input('shifts_filter_day');
    }
    $shiftsFilter->setStartTime(parse_date('Y-m-d H:i', $selected_day . ' 00:00'));
    $shiftsFilter->setEndTime(parse_date('Y-m-d H:i', $selected_day . ' 23:59'));

    $shiftsFilterRenderer = new ShiftsFilterRenderer($shiftsFilter);
    $shiftsFilterRenderer->enableDaySelection($days);

    $shiftCalendarRenderer = shiftCalendarRendererByShiftFilter($shiftsFilter);

    return [
        $room->name,
        Room_view($room, $shiftsFilterRenderer, $shiftCalendarRenderer)
    ];
}

/**
 * Dispatch different room actions.
 *
 * @return array
 */
function rooms_controller(): array
{
    $request = request();
    $action = $request->input('action');
    if (!$request->has('action')) {
        $action = 'list';
    }

    switch ($action) {
        case 'view':
            return room_controller();
        case 'list':
        default:
            throw_redirect(page_link_to('admin_rooms'));
    }

    return ['', ''];
}

/**
 * @param Room $room
 * @return string
 */
function room_link(Room $room)
{
    return page_link_to('rooms', ['action' => 'view', 'room_id' => $room->id]);
}

/**
 * Loads room by request param room_id
 *
 * @return Room
 */
function load_room()
{
    if (!test_request_int('room_id')) {
        throw_redirect(page_link_to());
    }

    $room = Room::find(request()->input('room_id'));
    if (!$room) {
        throw_redirect(page_link_to());
    }

    return $room;
}
