<?php

/**
 * @package     Joomla.Site
 * @subpackage  com_contact
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

namespace Joomla\Component\Contact\Site\View\Contact;

use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\View\AbstractView;
use Joomla\CMS\MVC\View\GenericDataException;
use Joomla\Component\Contact\Site\Model\ContactModel;

// phpcs:disable PSR1.Files.SideEffects
\defined('_JEXEC') or die;
// phpcs:enable PSR1.Files.SideEffects

/**
 * View to create a VCF for a contact item
 *
 * @since  1.6
 */
class VcfView extends AbstractView
{
    /**
     * The contact item
     *
     * @var   \stdClass
     */
    protected $item;

    /**
     * Execute and display a template script.
     *
     * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
     *
     * @return  void
     *
     * @throws  GenericDataException
     */
    public function display($tpl = null)
    {
        /** @var ContactModel $model */
        $model      = $this->getModel();
        $app        = Factory::getApplication();
        $user       = $app->getIdentity();
        $item       = $model->getItem();

        // Check for errors.
        if (\count($errors = $model->getErrors())) {
            throw new GenericDataException(implode("\n", $errors), 500);
        }

        // Check if access is not public
        $groups = $user->getAuthorisedViewLevels();

        if (!\in_array($item->access, $groups) || !\in_array($item->category_access, $groups)) {
            $app->enqueueMessage(Text::_('JERROR_ALERTNOAUTHOR'), 'error');
            $app->setHeader('status', 403, true);

            return;
        }

        $this->getDocument()->setMimeEncoding('text/directory', true);

        // Compute lastname, firstname and middlename
        $item->name = trim($item->name);

        // "Lastname, Firstname Middlename" format support
        // e.g. "de Gaulle, Charles"
        $namearray = explode(',', $item->name);

        if (\count($namearray) > 1) {
            $lastname         = $namearray[0];
            $card_name        = $lastname;
            $name_and_midname = trim($namearray[1]);

            $firstname = '';

            if (!empty($name_and_midname)) {
                $namearray = explode(' ', $name_and_midname);

                $firstname  = $namearray[0];
                $middlename = (\count($namearray) > 1) ? $namearray[1] : '';
                $card_name  = $firstname . ' ' . ($middlename ? $middlename . ' ' : '') . $card_name;
            }
        } else {
            // "Firstname Middlename Lastname" format support
            $namearray = explode(' ', $item->name);

            $middlename = (\count($namearray) > 2) ? $namearray[1] : '';
            $firstname  = array_shift($namearray);
            $lastname   = \count($namearray) ? end($namearray) : '';
            $card_name  = $firstname . ($middlename ? ' ' . $middlename : '') . ($lastname ? ' ' . $lastname : '');
        }

        $rev = date('c', strtotime($item->modified));

        Factory::getApplication()->setHeader('Content-disposition', 'attachment; filename="' . $card_name . '.vcf"', true);

        $vcard   = [];
        $vcard[] = 'BEGIN:VCARD';
        $vcard[] = 'VERSION:3.0';
        $vcard[] = 'N:' . $lastname . ';' . $firstname . ';' . $middlename;
        $vcard[] = 'FN:' . $item->name;
        $vcard[] = 'TITLE:' . $item->con_position;
        $vcard[] = 'TEL;TYPE=WORK,VOICE:' . $item->telephone;
        $vcard[] = 'TEL;TYPE=WORK,FAX:' . $item->fax;
        $vcard[] = 'TEL;TYPE=WORK,MOBILE:' . $item->mobile;
        $vcard[] = 'ADR;TYPE=WORK:;;' . $item->address . ';' . $item->suburb . ';' . $item->state . ';' . $item->postcode . ';' . $item->country;
        $vcard[] = 'LABEL;TYPE=WORK:' . $item->address . "\n" . $item->suburb . "\n" . $item->state . "\n" . $item->postcode . "\n" . $item->country;
        $vcard[] = 'EMAIL;TYPE=PREF,INTERNET:' . $item->email_to;
        $vcard[] = 'URL:' . $item->webpage;
        $vcard[] = 'REV:' . $rev . 'Z';
        $vcard[] = 'END:VCARD';

        echo implode("\n", $vcard);
    }
}
