<?php

/**
 * ---------------------------------------------------------------------
 *
 * GLPI - Gestionnaire Libre de Parc Informatique
 *
 * http://glpi-project.org
 *
 * @copyright 2015-2025 Teclib' and contributors.
 * @copyright 2003-2014 by the INDEPNET Development Team.
 * @licence   https://www.gnu.org/licenses/gpl-3.0.html
 *
 * ---------------------------------------------------------------------
 *
 * LICENSE
 *
 * This file is part of GLPI.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 *
 * ---------------------------------------------------------------------
 */

/**
 * NotificationTargetReservation Class
 **/
class NotificationTargetReservation extends NotificationTarget
{
    public function getEvents()
    {
        return ['new'    => __('New reservation'),
            'update' => __('Update of a reservation'),
            'delete' => __('Deletion of a reservation'),
            'alert'  => __('Reservation expired'),
        ];
    }


    public function addAdditionalTargets($event = '')
    {
        if ($event != 'alert') {
            $this->addTarget(
                Notification::ITEM_TECH_IN_CHARGE,
                __('Technician in charge')
            );
            $this->addTarget(
                Notification::ITEM_TECH_GROUP_IN_CHARGE,
                __('Group in charge')
            );
            $this->addTarget(Notification::ITEM_USER, __('Hardware user'));
            $this->addTarget(Notification::AUTHOR, _n('Requester', 'Requesters', 1));
        }
        // else if ($event == 'alert') {
        //   $this->addTarget(Notification::ITEM_USER, __('User reserving equipment'));
        //}
    }


    public function addDataForTemplate($event, $options = [])
    {
        //----------- Reservation infos -------------- //
        $events                                  = $this->getAllEvents();

        $this->data['##reservation.action##']   = $events[$event];

        if ($event != 'alert') {
            $this->data['##reservation.user##']   = "";
            $user_tmp                              = new User();
            if ($user_tmp->getFromDB($this->obj->getField('users_id'))) {
                $this->data['##reservation.user##'] = $user_tmp->getName();
            }
            $this->data['##reservation.begin##']   = Html::convDateTime($this->obj->getField('begin'));
            $this->data['##reservation.end##']     = Html::convDateTime($this->obj->getField('end'));
            $this->data['##reservation.comment##'] = $this->obj->getField('comment');

            $reservationitem = new ReservationItem();
            $reservationitem->getFromDB($this->obj->getField('reservationitems_id'));
            $itemtype        = $reservationitem->getField('itemtype');

            if ($item = getItemForItemtype($itemtype)) {
                $item->getFromDB($reservationitem->getField('items_id'));
                $this->data["##reservation.note##"]
                                 = $reservationitem->getField('comment');
                $this->data['##reservation.itemtype##']
                                 = $item->getTypeName(1);
                $this->data['##reservation.item.name##']
                                 = $item->getField('name');
                $this->data['##reservation.item.entity##']
                                 = Dropdown::getDropdownName(
                                     'glpi_entities',
                                     $item->getField('entities_id')
                                 );

                if ($item->isField('users_id_tech')) {
                    $this->data['##reservation.item.tech##']
                                = Dropdown::getDropdownName(
                                    'glpi_users',
                                    $item->getField('users_id_tech')
                                );
                }

                $this->data['##reservation.itemurl##']
                                 = $this->formatURL(
                                     $options['additionnaloption']['usertype'],
                                     $itemtype . "_" . $item->getField('id')
                                 );

                $this->data['##reservation.url##']
                                 = $this->formatURL(
                                     $options['additionnaloption']['usertype'],
                                     "Reservation_" . $this->obj->getField('id')
                                 );
            }
        } else {
            $this->data['##reservation.entity##'] = Dropdown::getDropdownName(
                'glpi_entities',
                $options['entities_id']
            );

            foreach ($options['items'] as $id => $item) {
                $tmp = [];
                if ($obj = getItemForItemtype($item['itemtype'])) {
                    $tmp['##reservation.itemtype##']
                                    = $obj->getTypeName(1);
                    $tmp['##reservation.item##']
                                    = $item['item_name'];
                    $tmp['##reservation.expirationdate##']
                                    = Html::convDateTime($item['end']);
                    $tmp['##reservation.url##']
                                    = $this->formatURL(
                                        $options['additionnaloption']['usertype'],
                                        "Reservation_" . $id
                                    );
                }
                $this->data['reservations'][] = $tmp;
            }
        }

        $this->getTags();
        foreach ($this->tag_descriptions[NotificationTarget::TAG_LANGUAGE] as $tag => $values) {
            if (!isset($this->data[$tag])) {
                $this->data[$tag] = $values['label'];
            }
        }
    }


    public function getTags()
    {

        $tags_all = ['reservation.item'     => _n('Associated item', 'Associated items', 1),
            'reservation.itemtype' => __('Item type'),
            'reservation.url'      => __('URL'),
            'reservation.itemurl'  => __('URL of item reserved'),
            'reservation.action'   => _n('Event', 'Events', 1),
        ];

        foreach ($tags_all as $tag => $label) {
            $this->addTagToList(['tag'   => $tag,
                'label' => $label,
                'value' => true,
            ]);
        }

        $tags_except_alert = ['reservation.user'        => __('Writer'),
            'reservation.begin'       => __('Start date'),
            'reservation.end'         => __('End date'),
            'reservation.comment'     => __('Comments'),
            'reservation.note'        => __('Notes'),
            'reservation.item.entity' => Entity::getTypeName(1),
            'reservation.item.name'   => _n('Associated item', 'Associated items', 1),
            'reservation.item.tech'   => __('Technician in charge'),
        ];

        foreach ($tags_except_alert as $tag => $label) {
            $this->addTagToList(['tag'    => $tag,
                'label'  => $label,
                'value'  => true,
                'events' => ['new', 'update', 'delete'],
            ]);
        }

        $this->addTagToList(['tag'     => 'items',
            'label'   => __('Device list'),
            'value'   => false,
            'foreach' => true,
            'events'  => ['alert'],
        ]);

        $tag_alert = ['reservation.expirationdate' => __('End date'),
            'reservation.entity'         => Entity::getTypeName(1),
        ];

        foreach ($tag_alert as $tag => $label) {
            $this->addTagToList(['tag'    => $tag,
                'label'  => $label,
                'value'  => true,
                'events' => ['alert'],
            ]);
        }

        asort($this->tag_descriptions);
    }

    public function getObjectItem($event = '')
    {

        if ($this->obj) {
            $ri = new ReservationItem();

            if ($ri->getFromDB($this->obj->getField('reservationitems_id'))) {
                $itemtype = $ri->getField('itemtype');

                if (
                    ($itemtype != NOT_AVAILABLE) && ($itemtype != '')
                    && ($item = getItemForItemtype($itemtype))
                ) {
                    $item->getFromDB($ri->getField('items_id'));
                    $this->target_object[] = $item;
                }
            }
        }
    }
}
