<?php
// vcard.php - تولید دینامیک vCard 3.0 بر اساس contacts.xml

// خواندن key از URL (website.com/name → key=name)
$key = isset($_GET['key']) ? trim($_GET['key']) : '';
$key = strtolower($key);

if ($key === '') {
    $key = 'default';
}

$xmlFile = __DIR__ . '/contacts.xml';
if (!file_exists($xmlFile)) {
    sendSimpleFallbackVcard($key);
    exit;
}

$xml = simplexml_load_file($xmlFile);
if ($xml === false) {
    sendSimpleFallbackVcard($key);
    exit;
}

// پیدا کردن شخص
$personNode = null;
foreach ($xml->person as $p) {
    $attrKey = strtolower((string)$p['key']);
    if ($attrKey === $key) {
        $personNode = $p;
        break;
    }
}

// اگر نبود، از default استفاده کن
if ($personNode === null && isset($xml->default)) {
    $personNode = $xml->default;
}

if ($personNode === null) {
    sendSimpleFallbackVcard($key);
    exit;
}

function getNodeValue($parent, $name, $default = '') {
    if (isset($parent->$name)) {
        return trim((string)$parent->$name);
    }
    return $default;
}

// فیلدهای نام
$fn         = getNodeValue($personNode, 'fn', 'Unnamed');
$given      = getNodeValue($personNode, 'given', '');
$family     = getNodeValue($personNode, 'family', '');
$additional = getNodeValue($personNode, 'additional', '');
$prefix     = getNodeValue($personNode, 'prefix', '');
$suffix     = getNodeValue($personNode, 'suffix', '');

$nickname   = getNodeValue($personNode, 'nickname', '');

// شغلی / سازمان
$title      = getNodeValue($personNode, 'title', '');
$role       = getNodeValue($personNode, 'role', '');
$org        = getNodeValue($personNode, 'org', '');
$department = getNodeValue($personNode, 'department', '');

// ایمیل‌ها
$email_work     = getNodeValue($personNode, 'email_work', '');
$email_personal = getNodeValue($personNode, 'email_personal', '');

// تلفن‌ها
$phone_mobile = getNodeValue($personNode, 'phone_mobile', '');
$phone_work   = getNodeValue($personNode, 'phone_work', '');
$phone_home   = getNodeValue($personNode, 'phone_home', '');
$phone_fax    = getNodeValue($personNode, 'phone_fax', '');

// وب / سوشال
$url         = getNodeValue($personNode, 'url', '');
$url_company = getNodeValue($personNode, 'url_company', '');

$linkedin  = getNodeValue($personNode, 'linkedin', '');
$whatsapp  = getNodeValue($personNode, 'whatsapp', '');
$telegram  = getNodeValue($personNode, 'telegram', '');
$instagram = getNodeValue($personNode, 'instagram', '');
$twitter   = getNodeValue($personNode, 'twitter', '');

// آدرس کاری
$addr_street   = getNodeValue($personNode, 'address_work_street', '');
$addr_city     = getNodeValue($personNode, 'address_work_city', '');
$addr_region   = getNodeValue($personNode, 'address_work_region', '');
$addr_postcode = getNodeValue($personNode, 'address_work_postcode', '');
$addr_country  = getNodeValue($personNode, 'address_work_country', '');

// سایر
$note  = getNodeValue($personNode, 'note', '');
$photo = getNodeValue($personNode, 'photo', '');
$logo  = getNodeValue($personNode, 'logo', '');

// شروع ساخت vCard 3.0
$lines   = [];
$lines[] = 'BEGIN:VCARD';
$lines[] = 'VERSION:3.0';

// N:Family;Given;Additional;Prefix;Suffix
$lines[] = 'N:' . escapeVcard($family) . ';' . escapeVcard($given) . ';' . escapeVcard($additional) . ';' . escapeVcard($prefix) . ';' . escapeVcard($suffix);
$lines[] = 'FN:' . escapeVcard($fn);

if ($nickname !== '') {
    $lines[] = 'NICKNAME:' . escapeVcard($nickname);
}

if ($title !== '') {
    $lines[] = 'TITLE:' . escapeVcard($title);
}
if ($role !== '') {
    $lines[] = 'ROLE:' . escapeVcard($role);
}

if ($org !== '') {
    if ($department !== '') {
        $lines[] = 'ORG:' . escapeVcard($org) . ';' . escapeVcard($department);
    } else {
        $lines[] = 'ORG:' . escapeVcard($org);
    }
}

// ایمیل‌ها
if ($email_work !== '') {
    $lines[] = 'EMAIL;TYPE=INTERNET,WORK:' . escapeVcard($email_work);
}
if ($email_personal !== '') {
    $lines[] = 'EMAIL;TYPE=INTERNET,HOME:' . escapeVcard($email_personal);
}

// تلفن‌ها
if ($phone_mobile !== '') {
    $lines[] = 'TEL;TYPE=CELL,VOICE:' . escapeVcard($phone_mobile);
}
if ($phone_work !== '') {
    $lines[] = 'TEL;TYPE=WORK,VOICE:' . escapeVcard($phone_work);
}
if ($phone_home !== '') {
    $lines[] = 'TEL;TYPE=HOME,VOICE:' . escapeVcard($phone_home);
}
if ($phone_fax !== '') {
    $lines[] = 'TEL;TYPE=FAX,WORK:' . escapeVcard($phone_fax);
}

// آدرس کاری (ADR;TYPE=WORK:;;street;city;region;postcode;country)
if ($addr_street !== '' || $addr_city !== '' || $addr_region !== '' || $addr_postcode !== '' || $addr_country !== '') {
    $adrParts = [
        '', // PO Box
        '', // Extended
        $addr_street,
        $addr_city,
        $addr_region,
        $addr_postcode,
        $addr_country
    ];
    $adrEscaped = array_map('escapeVcard', $adrParts);
    $lines[]    = 'ADR;TYPE=WORK:' . implode(';', $adrEscaped);
}

// وب‌سایت‌ها
if ($url !== '') {
    $lines[] = 'URL;TYPE=WORK:' . escapeVcard($url);
}
if ($url_company !== '') {
    $lines[] = 'URL;TYPE=COMPANY:' . escapeVcard($url_company);
}

// پروفایل‌های سوشال
if ($linkedin !== '') {
    $lines[] = 'URL;TYPE=linkedin:' . escapeVcard($linkedin);
}
if ($whatsapp !== '') {
    $lines[] = 'URL;TYPE=whatsapp:' . escapeVcard($whatsapp);
}
if ($telegram !== '') {
    $lines[] = 'URL;TYPE=telegram:' . escapeVcard($telegram);
}
if ($instagram !== '') {
    $lines[] = 'URL;TYPE=instagram:' . escapeVcard($instagram);
}
if ($twitter !== '') {
    $lines[] = 'URL;TYPE=twitter:' . escapeVcard($twitter);
}

// PHOTO: امبد به صورت base64 برای iOS/Android
if ($photo !== '') {
    embedPhotoFromUrl($photo, $lines, 'PHOTO');
}

// LOGO (احتمالاً در UI استفاده نشود، ولی اطلاعاتی است)
if ($logo !== '') {
    $lines[] = 'LOGO;VALUE=URI:' . escapeVcard($logo);
}

// Note
if ($note !== '') {
    $lines[] = 'NOTE:' . escapeVcard($note);
}

$lines[] = 'END:VCARD';

// تبدیل به متن با CRLF
$body = implode("\r\n", $lines) . "\r\n";

// هدرها
header('Content-Type: text/vcard; charset=utf-8');
header('Content-Disposition: attachment; filename="' . $key . '.vcf"');

echo $body;
exit;

// ------------------ توابع کمکی ------------------

function escapeVcard($value) {
    $value = str_replace('\\', '\\\\', $value);
    $value = str_replace(';', '\;', $value);
    $value = str_replace(',', '\,', $value);
    $value = str_replace("\n", '\n', $value);
    $value = str_replace("\r", '', $value);
    return $value;
}

/**
 * امبد کردن عکس از یک URL داخل vCard به صورت base64
 */
function embedPhotoFromUrl($url, &$lines, $propertyName = 'PHOTO') {
    // اگر امکان خواندن URL غیرفعال بود → برگرد به URI ساده
    if (!ini_get('allow_url_fopen')) {
        $lines[] = $propertyName . ';VALUE=URI:' . escapeVcard($url);
        return;
    }

    $imgData = @file_get_contents($url);
    if ($imgData === false) {
        // اگر دانلود نشد، حداقل URI داشته باشیم
        $lines[] = $propertyName . ';VALUE=URI:' . escapeVcard($url);
        return;
    }

    // MIME type
    $mimeType = 'image/png';
    $imgInfo  = @getimagesize($url);
    if ($imgInfo && isset($imgInfo['mime'])) {
        $mimeType = $imgInfo['mime'];
    } else {
        $ext = strtolower(pathinfo(parse_url($url, PHP_URL_PATH), PATHINFO_EXTENSION));
        if ($ext === 'jpg' || $ext === 'jpeg') {
            $mimeType = 'image/jpeg';
        } elseif ($ext === 'gif') {
            $mimeType = 'image/gif';
        } elseif ($ext === 'png') {
            $mimeType = 'image/png';
        }
    }

    $type = 'PNG';
    if ($mimeType === 'image/jpeg' || $mimeType === 'image/jpg') {
        $type = 'JPEG';
    } elseif ($mimeType === 'image/gif') {
        $type = 'GIF';
    }

    $b64 = base64_encode($imgData);

    // vCard 3.0: خطوط حداکثر ~75 کاراکتر، ادامه با space
    $b64Chunks = chunk_split($b64, 74, "\r\n ");
    $b64Chunks = rtrim($b64Chunks);

    $lines[] = $propertyName . ';ENCODING=b;TYPE=' . $type . ':' . $b64Chunks;
}

function sendSimpleFallbackVcard($key) {
    $lines   = [];
    $lines[] = 'BEGIN:VCARD';
    $lines[] = 'VERSION:3.0';
    $lines[] = 'N:LEO LANDO;Team;;;';
    $lines[] = 'FN:LEO LANDO S.L.';
    $lines[] = 'ORG:LEO LANDO S.L.';
    $lines[] = 'EMAIL;TYPE=INTERNET,WORK:info@leolando.com';
    $lines[] = 'URL;TYPE=WORK:https://leolando.com';
    $lines[] = 'END:VCARD';

    $body = implode("\r\n", $lines) . "\r\n";

    header('Content-Type: text/vcard; charset=utf-8');
    header('Content-Disposition: attachment; filename="' . $key . '.vcf"');
    echo $body;
}