<?php

namespace MintyPHP\Module\Helpdesk\Service;

use MintyPHP\Service\Mail\MailService;

class HandoverNotificationService
{
    public function __construct(
        private readonly MailService $mailService,
    ) {
    }

    /**
     * Notify the assignee that a handover was assigned to them.
     *
     * @param array<string, mixed> $handover  Row from HandoverRepository::findById (includes joined user fields)
     */
    public function notifyAssigned(array $handover): void
    {
        $toEmail = trim((string) ($handover['assigned_to_email'] ?? ''));
        if ($toEmail === '') {
            return;
        }

        $assigneeName = trim((string) ($handover['assigned_to_label'] ?? $toEmail));
        $assignedByName = trim((string) ($handover['assigned_by_label'] ?? ''));
        $debitorName = trim((string) ($handover['debitor_name'] ?? ''));
        $domainUrl = trim((string) ($handover['domain_url'] ?? ''));
        $dueDate = trim((string) ($handover['due_date'] ?? ''));
        $handoverId = (int) ($handover['id'] ?? 0);
        $handoverUrl = appUrl('helpdesk/handovers/edit/' . $handoverId);

        $vars = [
            'assignee_name' => $assigneeName,
            'assigned_by_name' => $assignedByName,
            'debitor_name' => $debitorName !== '' ? $debitorName : '—',
            'domain_url' => $domainUrl !== '' ? $domainUrl : '—',
            'due_date' => $dueDate !== '' ? $dueDate : '—',
            'handover_url' => $handoverUrl,
            'app_name' => appTitle(),
        ];

        $subject = sprintf('[%s] Ihnen wurde eine Übergabe zugewiesen', appTitle());

        $this->mailService->sendTemplate('handover_assigned', $vars, $toEmail, $subject);
    }

    /**
     * Notify managers that a handover was submitted for review.
     * Sends to the person who assigned (assigned_by), falling back to created_by.
     *
     * @param array<string, mixed> $handover
     */
    public function notifyReviewRequested(array $handover): void
    {
        // Notify the assigning manager (assigned_by) — email not directly stored, use created_by as fallback
        // We send to assigned_by_email if it was joined; otherwise notify created_by_email.
        // Since the repository joins assigned_by as assigned_by_label but not email,
        // we notify the assignee's manager via a generic approach: send to created_by.
        // This is intentionally simple — the manager who assigned will get the email.
        $toEmail = trim((string) ($handover['assigned_by_email'] ?? ''));
        if ($toEmail === '') {
            return;
        }

        $managerName = trim((string) ($handover['assigned_by_label'] ?? $toEmail));
        $assigneeName = trim((string) ($handover['assigned_to_label'] ?? ''));
        $debitorName = trim((string) ($handover['debitor_name'] ?? ''));
        $domainUrl = trim((string) ($handover['domain_url'] ?? ''));
        $handoverId = (int) ($handover['id'] ?? 0);
        $handoverUrl = appUrl('helpdesk/handovers/edit/' . $handoverId);

        $vars = [
            'manager_name' => $managerName,
            'assignee_name' => $assigneeName !== '' ? $assigneeName : '—',
            'debitor_name' => $debitorName !== '' ? $debitorName : '—',
            'domain_url' => $domainUrl !== '' ? $domainUrl : '—',
            'handover_url' => $handoverUrl,
            'app_name' => appTitle(),
        ];

        $subject = sprintf('[%s] Übergabe wurde zur Prüfung eingereicht', appTitle());

        $this->mailService->sendTemplate('handover_review_requested', $vars, $toEmail, $subject);
    }
}
