<?php
declare(strict_types=1);

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

/*
|--------------------------------------------------------------------------
| Basic in-app notification
|--------------------------------------------------------------------------
*/
if (!function_exists('notify_user')) {
    function notify_user(
        PDO $pdo,
        int $userId,
        string $title,
        string $message,
        string $type = 'general',
        ?int $relatedId = null
    ): bool {
        if ($userId <= 0) {
            return false;
        }

        $sql = "
            INSERT INTO notifications (
                user_id,
                title,
                message,
                type,
                related_id,
                is_read,
                created_at
            ) VALUES (
                :user_id,
                :title,
                :message,
                :type,
                :related_id,
                0,
                NOW()
            )
        ";

        try {
            $stmt = $pdo->prepare($sql);
            return $stmt->execute([
                ':user_id'    => $userId,
                ':title'      => $title,
                ':message'    => $message,
                ':type'       => $type,
                ':related_id' => $relatedId,
            ]);
        } catch (Throwable $e) {
            error_log('notify_user error: ' . $e->getMessage());
            return false;
        }
    }
}

if (!function_exists('notify_users_bulk')) {
    function notify_users_bulk(
        PDO $pdo,
        array $userIds,
        string $title,
        string $message,
        string $type = 'general',
        ?int $relatedId = null
    ): int {
        $count = 0;

        foreach ($userIds as $userId) {
            $userId = (int)$userId;
            if ($userId > 0 && notify_user($pdo, $userId, $title, $message, $type, $relatedId)) {
                $count++;
            }
        }

        return $count;
    }
}

/*
|--------------------------------------------------------------------------
| Case notifications
|--------------------------------------------------------------------------
*/
if (!function_exists('notify_all_users_case_update')) {
    function notify_all_users_case_update(
        PDO $pdo,
        int $caseId,
        string $caseNo,
        string $caseTitle,
        string $editedByName
    ): void {
        try {
            $stmt = $pdo->query("SELECT id FROM users WHERE id IS NOT NULL");
            $users = $stmt->fetchAll(PDO::FETCH_ASSOC) ?: [];

            $title   = 'تعديل على قضية';
            $message = "تم تعديل القضية رقم {$caseNo} - {$caseTitle} بواسطة {$editedByName}";

            foreach ($users as $user) {
                $userId = (int)($user['id'] ?? 0);
                if ($userId > 0) {
                    notify_user($pdo, $userId, $title, $message, 'case_update', $caseId);
                }
            }
        } catch (Throwable $e) {
            error_log('notify_all_users_case_update error: ' . $e->getMessage());
        }
    }
}

if (!function_exists('notify_all_users_case_add')) {
    function notify_all_users_case_add(
        PDO $pdo,
        int $caseId,
        string $caseNo,
        string $caseTitle,
        string $addedByName
    ): void {
        try {
            $stmt = $pdo->query("SELECT id FROM users WHERE id IS NOT NULL");
            $users = $stmt->fetchAll(PDO::FETCH_ASSOC) ?: [];

            $title   = 'إضافة قضية جديدة';
            $message = "تمت إضافة القضية رقم {$caseNo} - {$caseTitle} بواسطة {$addedByName}";

            foreach ($users as $user) {
                $userId = (int)($user['id'] ?? 0);
                if ($userId > 0) {
                    notify_user($pdo, $userId, $title, $message, 'case_add', $caseId);
                }
            }
        } catch (Throwable $e) {
            error_log('notify_all_users_case_add error: ' . $e->getMessage());
        }
    }
}

/*
|--------------------------------------------------------------------------
| Mail helpers
|--------------------------------------------------------------------------
*/
if (!function_exists('hlg_build_mailer')) {
    function hlg_build_mailer(): PHPMailer
    {
        $mail = new PHPMailer(true);

        $mail->isSMTP();
        $mail->Host       = 'localhost';
        $mail->SMTPAuth   = false;
        $mail->Port       = 25;
        $mail->CharSet    = 'UTF-8';

        $mail->setFrom('no-reply@hamdanlegalgroup.ae', 'HLG Justice Hub');
        $mail->isHTML(true);

        return $mail;
    }
}

if (!function_exists('hlg_send_email')) {
    function hlg_send_email(
        string $toEmail,
        string $toName,
        string $subject,
        string $htmlBody,
        string $textBody = '',
        array $cc = []
    ): bool {
        if (trim($toEmail) === '') {
            return false;
        }

        try {
            $mail = hlg_build_mailer();
            $mail->addAddress($toEmail, $toName);

            foreach ($cc as $ccEmail) {
                $ccEmail = trim((string)$ccEmail);
                if ($ccEmail !== '') {
                    $mail->addCC($ccEmail);
                }
            }

            $mail->Subject = $subject;
            $mail->Body    = $htmlBody;
            $mail->AltBody = $textBody !== '' ? $textBody : strip_tags(str_replace(['<br>', '<br/>', '<br />'], "\n", $htmlBody));

            return $mail->send();
        } catch (Exception $e) {
            error_log('hlg_send_email error: ' . $e->getMessage());
            return false;
        }
    }
}

/*
|--------------------------------------------------------------------------
| Salary notification
|--------------------------------------------------------------------------
*/
if (!function_exists('send_salary_notification_to_employee')) {
    function send_salary_notification_to_employee(
        string $toEmail,
        string $employeeName,
        string $payrollMonth,
        float $netSalary,
        float $grossSalary = 0.0,
        array $cc = ['contact@hamdanlegalgroup.ae']
    ): bool {
        $netFormatted   = number_format($netSalary, 2);
        $grossFormatted = number_format($grossSalary, 2);

        $grossHtml = $grossSalary > 0
            ? "<strong>إجمالي الراتب:</strong> {$grossFormatted} درهم<br>"
            : '';

        $subject = 'إشعار تحويل الراتب';

        $html = "
        <div dir='rtl' style='font-family:Tahoma,Arial,sans-serif;line-height:1.9;color:#111'>
            <p>السيد/ة {$employeeName}</p>
            <p>نحيطكم علمًا بأنه تم اعتماد/تحويل راتبكم بنجاح.</p>
            <p>
                <strong>الشهر:</strong> {$payrollMonth}<br>
                {$grossHtml}
                <strong>صافي الراتب:</strong> {$netFormatted} درهم
            </p>
            <p>في حال وجود أي خصومات تلقائية مجدولة، ستصلكم رسالة مستقلة بها تفاصيل الخصم.</p>
            <p>مع التحية<br>HLG Justice Hub</p>
        </div>";

        $text =
            "السيد/ة {$employeeName}\n" .
            "تم اعتماد/تحويل راتبكم بنجاح.\n" .
            "الشهر: {$payrollMonth}\n" .
            ($grossSalary > 0 ? "إجمالي الراتب: {$grossFormatted} درهم\n" : '') .
            "صافي الراتب: {$netFormatted} درهم\n" .
            "في حال وجود أي خصومات تلقائية مجدولة، ستصلكم رسالة مستقلة بها تفاصيل الخصم.\n" .
            "مع التحية\nHLG Justice Hub";

        return hlg_send_email($toEmail, $employeeName, $subject, $html, $text, $cc);
    }
}

if (!function_exists('notify_salary_user')) {
    function notify_salary_user(
        PDO $pdo,
        int $userId,
        string $payrollMonth,
        float $netSalary,
        float $grossSalary = 0.0
    ): bool {
        $title = 'إشعار تحويل الراتب';

        $message = $grossSalary > 0
            ? "تم اعتماد راتب شهر {$payrollMonth}. إجمالي الراتب: " . number_format($grossSalary, 2) . " درهم، وصافي الراتب: " . number_format($netSalary, 2) . " درهم."
            : "تم اعتماد راتب شهر {$payrollMonth}. صافي الراتب: " . number_format($netSalary, 2) . " درهم.";

        return notify_user($pdo, $userId, $title, $message, 'salary');
    }
}

/*
|--------------------------------------------------------------------------
| Deduction notification
|--------------------------------------------------------------------------
*/
if (!function_exists('send_deduction_notification_to_employee')) {
    function send_deduction_notification_to_employee(
        string $toEmail,
        string $employeeName,
        string $payrollMonth,
        float $deductionAmount,
        string $reasonText,
        float $remaining = 0.0,
        array $cc = ['contact@hamdanlegalgroup.ae']
    ): bool {
        $amountFormatted = number_format($deductionAmount, 2);
        $remainingHtml   = $remaining > 0 ? "<strong>المتبقي:</strong> " . number_format($remaining, 2) . " درهم<br>" : '';

        $subject = 'إشعار خصم تلقائي من الراتب';

        $html = "
        <div dir='rtl' style='font-family:Tahoma,Arial,sans-serif;line-height:1.9;color:#111'>
            <p>السيد/ة {$employeeName}</p>
            <p>نحيطكم علمًا بأنه بعد اعتماد راتب شهر {$payrollMonth}، تم تسجيل خصم تلقائي كما يلي:</p>
            <p>
                <strong>الشهر:</strong> {$payrollMonth}<br>
                <strong>المبلغ المخصوم:</strong> {$amountFormatted} درهم<br>
                <strong>السبب:</strong> {$reasonText}<br>
                {$remainingHtml}
            </p>
            <p>إذا كان لديكم استفسار، يرجى التواصل مع الإدارة المالية أو الموارد البشرية.</p>
            <p>مع التحية<br>HLG Justice Hub</p>
        </div>";

        $text =
            "السيد/ة {$employeeName}\n" .
            "بعد اعتماد راتب شهر {$payrollMonth}، تم تسجيل خصم تلقائي.\n" .
            "المبلغ المخصوم: {$amountFormatted} درهم\n" .
            "السبب: {$reasonText}\n" .
            ($remaining > 0 ? "المتبقي: " . number_format($remaining, 2) . " درهم\n" : '') .
            "مع التحية\nHLG Justice Hub";

        return hlg_send_email($toEmail, $employeeName, $subject, $html, $text, $cc);
    }
}

if (!function_exists('notify_deduction_user')) {
    function notify_deduction_user(
        PDO $pdo,
        int $userId,
        string $payrollMonth,
        float $deductionAmount,
        string $reasonText,
        float $remaining = 0.0,
        ?int $relatedId = null
    ): bool {
        $title = 'إشعار خصم تلقائي من الراتب';

        $message = "تم تسجيل خصم تلقائي بعد اعتماد راتب شهر {$payrollMonth} بمبلغ " .
            number_format($deductionAmount, 2) .
            " درهم. السبب: {$reasonText}" .
            ($remaining > 0 ? ". المتبقي: " . number_format($remaining, 2) . " درهم." : ".");

        return notify_user($pdo, $userId, $title, $message, 'salary_deduction', $relatedId);
    }
}