<?php
declare(strict_types=1);

header('Content-Type: application/json; charset=UTF-8');

const CONTACT_TO = 'dsinf@dsinf.cl';
const CONTACT_SUBJECT = 'Mensaje desde sitio web DSinf';
const CONTACT_FROM = 'dsinf@dsinf.cl';

function respond(bool $success, string $message, int $statusCode = 200): void
{
    http_response_code($statusCode);
    echo json_encode([
        'success' => $success,
        'message' => $message,
    ], JSON_UNESCAPED_UNICODE);
    exit;
}

function post_value(string $key): string
{
    return trim((string)($_POST[$key] ?? ''));
}

function clean_header_value(string $value): string
{
    return str_replace(["\r", "\n"], '', $value);
}

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    respond(false, 'Método no permitido.', 405);
}

// Campo trampa para reducir envíos automatizados.
if (post_value('website') !== '') {
    respond(true, 'Mensaje enviado correctamente. Nos contactaremos con usted a la brevedad.');
}

$nombre = post_value('nombre');
$email = post_value('email');
$telefono = post_value('telefono');
$mensaje = post_value('mensaje');

if ($nombre === '' || $email === '' || $telefono === '' || $mensaje === '') {
    respond(false, 'Debe completar todos los campos del formulario.', 422);
}

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    respond(false, 'El correo electrónico ingresado no es válido.', 422);
}

if (strlen($nombre) > 120 || strlen($email) > 160 || strlen($telefono) > 60) {
    respond(false, 'Uno de los campos supera el largo permitido.', 422);
}

if (strlen($mensaje) > 5000) {
    respond(false, 'El mensaje es demasiado largo.', 422);
}

$timezone = new DateTimeZone('America/Santiago');
$now = new DateTimeImmutable('now', $timezone);
$ip = $_SERVER['REMOTE_ADDR'] ?? 'No disponible';
$userAgent = $_SERVER['HTTP_USER_AGENT'] ?? 'No disponible';
$referer = $_SERVER['HTTP_REFERER'] ?? 'No disponible';

$bodyLines = [
    'Nuevo mensaje recibido desde el formulario de contacto del sitio web DSinf.',
    '',
    'Datos del cliente:',
    'Nombre: ' . $nombre,
    'Email: ' . $email,
    'Teléfono: ' . $telefono,
    '',
    'Mensaje:',
    $mensaje,
    '',
    'Datos del envío:',
    'Fecha: ' . $now->format('d-m-Y'),
    'Hora: ' . $now->format('H:i:s') . ' America/Santiago',
    'IP: ' . $ip,
    'Navegador: ' . $userAgent,
    'Página de origen: ' . $referer,
];

$body = implode(PHP_EOL, $bodyLines);

$safeEmail = clean_header_value($email);
$headers = [
    'MIME-Version: 1.0',
    'Content-Type: text/plain; charset=UTF-8',
    'Content-Transfer-Encoding: 8bit',
    'From: DSinf Sitio Web <' . CONTACT_FROM . '>',
    'Reply-To: ' . $safeEmail,
    'X-Mailer: PHP/' . phpversion(),
];

$sent = mail(
    CONTACT_TO,
    CONTACT_SUBJECT,
    $body,
    implode("\r\n", $headers)
);

if (!$sent) {
    respond(false, 'No fue posible enviar el mensaje. Intente nuevamente o escriba directamente a dsinf@dsinf.cl.', 500);
}

respond(true, 'Mensaje enviado correctamente. Nos contactaremos con usted a la brevedad.');
