<?php

use Engelsystem\Models\AngelType;
use Engelsystem\Models\Room;
use Engelsystem\Models\Shifts\NeededAngelType;
use Engelsystem\Models\User\User;

/**
 * @return string
 */
function admin_rooms_title()
{
    return __('Rooms');
}

/**
 * @return string
 */
function admin_rooms()
{
    $rooms_source = Rooms();
    $rooms = [];
    $request = request();

    foreach ($rooms_source as $room) {
        $rooms[] = [
            'name'    => Room_name_render($room),
            'dect'    => icon_bool($room->dect),
            'map_url' => icon_bool($room->map_url),
            'actions' => table_buttons([
                button(
                    page_link_to('admin_rooms', ['show' => 'edit', 'id' => $room->id]),
                    icon('pencil') . __('edit'),
                    'btn-sm'
                ),
                button(
                    page_link_to('admin_rooms', ['show' => 'delete', 'id' => $room->id]),
                    icon('trash') . __('delete'),
                    'btn-sm'
                )
            ])
        ];
    }

    $room = null;
    if ($request->has('show')) {
        $msg = '';
        $name = '';
        $map_url = null;
        $description = null;
        $dect = null;
        $room_id = 0;

        $angeltypes_source = AngelType::all();
        $angeltypes = [];
        $angeltypes_count = [];
        foreach ($angeltypes_source as $angeltype) {
            $angeltypes[$angeltype->id] = $angeltype->name;
            $angeltypes_count[$angeltype->id] = 0;
        }

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

            $room_id = $room->id;
            $name = $room->name;
            $map_url = $room->map_url;
            $description = $room->description;
            $dect = $room->dect;

            $angeltypes_count = NeededAngelType::whereRoomId($room_id)
                    ->pluck('count', 'angel_type_id')
                    ->toArray() + $angeltypes_count;
        }
        if ($request->input('show') == 'edit') {
            if ($request->hasPostData('submit')) {
                $valid = true;

                if ($request->has('name') && strlen(strip_request_tags('name')) > 0) {
                    $result = Room_validate_name(strip_request_tags('name'), $room_id);
                    if (!$result->isValid()) {
                        $valid = false;
                        $msg .= error(__('This name is already in use.'), true);
                    } else {
                        $name = $result->getValue();
                    }
                } else {
                    $valid = false;
                    $msg .= error(__('Please enter a name.'), true);
                }

                if ($request->has('map_url')) {
                    $map_url = strip_request_item('map_url');
                }

                if ($request->has('description')) {
                    $description = strip_request_item_nl('description');
                }
                if ($request->has('dect')) {
                    $dect = strip_request_item_nl('dect');
                }

                foreach ($angeltypes as $angeltype_id => $angeltype) {
                    $angeltypes_count[$angeltype_id] = 0;
                    $queryKey = 'angeltype_count_' . $angeltype_id;
                    if (!$request->has($queryKey)) {
                        continue;
                    }

                    if (preg_match('/^\d{1,4}$/', $request->input($queryKey))) {
                        $angeltypes_count[$angeltype_id] = $request->input($queryKey);
                    } else {
                        $valid = false;
                        $msg .= error(sprintf(
                            __('Please enter needed angels for type %s.'),
                            $angeltype
                        ), true);
                    }
                }

                if ($valid) {
                    if (empty($room_id)) {
                        $room_id = Room_create($name, $map_url, $description, $dect);
                    } else {
                        Room_update($room_id, $name, $map_url, $description, $dect);
                    }

                    NeededAngelType::whereRoomId($room_id)->delete();
                    $needed_angeltype_info = [];
                    foreach ($angeltypes_count as $angeltype_id => $angeltype_count) {
                        $angeltype = AngelType::find($angeltype_id);
                        if (!empty($angeltype) && $angeltype_count > 0) {
                            $neededAngelType = new NeededAngelType();
                            $neededAngelType->room_id = $room_id;
                            $neededAngelType->angelType()->associate($angeltype);
                            $neededAngelType->count = $angeltype_count;
                            $neededAngelType->save();

                            $needed_angeltype_info[] = $angeltype->name . ': ' . $angeltype_count;
                        }
                    }

                    engelsystem_log(
                        'Set needed angeltypes of room ' . $name
                        . ' to: ' . join(', ', $needed_angeltype_info)
                    );
                    success(__('Room saved.'));
                    throw_redirect(page_link_to('admin_rooms'));
                }
            }
            $angeltypes_count_form = [];
            foreach ($angeltypes as $angeltype_id => $angeltypeName) {
                $angeltypes_count_form[] = div('col-lg-4 col-md-6 col-xs-6', [
                    form_spinner('angeltype_count_' . $angeltype_id, $angeltypeName, $angeltypes_count[$angeltype_id])
                ]);
            }

            return page_with_title(admin_rooms_title(), [
                buttons([
                    button(page_link_to('admin_rooms'), __('back'), 'back')
                ]),
                $msg,
                form([
                    div('row', [
                        div('col-md-6', [
                            form_text('name', __('Name'), $name, false, 35),
                            form_text('dect', __('DECT'), $dect),
                            form_text('map_url', __('Map URL'), $map_url),
                            form_info('', __('The map url is used to display an iframe on the room page.')),
                            form_textarea('description', __('Description'), $description),
                            form_info('', __('Please use markdown for the description.')),
                        ]),
                        div('col-md-6', [
                            div('row', [
                                div('col-md-12', [
                                    form_info(__('Needed angels:'))
                                ]),
                                join($angeltypes_count_form)
                            ])
                        ])
                    ]),
                    form_submit('submit', __('Save'))
                ])
            ], true);
        } elseif ($request->input('show') == 'delete') {
            if ($request->hasPostData('ack')) {
                $room = Room::find($room_id);
                $shifts = $room->shifts;
                foreach ($shifts as $shift) {
                    $shift = Shift($shift);
                    foreach ($shift->shiftEntries as $entry) {
                        event('shift.entry.deleting', [
                            'user'       => User::find($entry['user_id']),
                            'start'      => $shift->start,
                            'end'        => $shift->end,
                            'name'       => $shift->shiftType->name,
                            'title'      => $shift->title,
                            'type'       => $entry->angelType->name,
                            'room'       => $room,
                            'freeloaded' => (bool) $entry['freeloaded'],
                        ]);
                    }
                }

                Room_delete($room);

                success(sprintf(__('Room %s deleted.'), $name));
                throw_redirect(page_link_to('admin_rooms'));
            }

            return page_with_title(admin_rooms_title(), [
                buttons([
                    button(page_link_to('admin_rooms'), __('back'), 'back')
                ]),
                sprintf(__('Do you want to delete room %s?'), $name),
                form([
                    form_submit('ack', __('Delete'), 'delete btn-danger'),
                ], page_link_to('admin_rooms', ['show' => 'delete', 'id' => $room_id])),
            ], true);
        }
    }

    return page_with_title(admin_rooms_title(), [
        buttons([
            button(page_link_to('admin_rooms', ['show' => 'edit']), __('add'))
        ]),
        msg(),
        table([
            'name'    => __('Name'),
            'dect'    => __('DECT'),
            'map_url' => __('Map'),
            'actions' => ''
        ], $rooms)
    ], true);
}