<?php

namespace App\Services;

use OneSignal;

class PushNotificationService
{
    /**
     * Send notification to a specific user by their ID
     *
     * @param int $userId
     * @param string $message
     * @param string $heading
     * @param array $data
     * @return mixed
     */
    public function sendToUser(int $userId, string $message, string $heading = 'JobHero', array $data = [])
    {
        try {
            return OneSignal::sendNotificationToExternalUser(
                $message,
                (string) $userId,
                null,
                $data ?: null,
                null,
                null,
                $heading
            );
        } catch (\Exception $e) {}
    }

    /**
     * Send notification to multiple users
     *
     * @param array $userIds
     * @param string $message
     * @param string $heading
     * @param array $data
     * @return array
     */
    public function sendToUsers(array $userIds, string $message, string $heading = 'JobHero', array $data = [])
    {
        $results = [];
        foreach ($userIds as $userId) {
            $results[$userId] = $this->sendToUser($userId, $message, $heading, $data);
        }
        return $results;
    }

    /**
     * Send scheduled notification to a user
     *
     * @param int $userId
     * @param string $message
     * @param string $sendAt UTC datetime string
     * @param string $heading
     * @param array $data
     * @return mixed
     */
    public function sendScheduledToUser(int $userId, string $message, string $sendAt, string $heading = 'JobHero', array $data = [])
    {
        try {
            return OneSignal::sendNotificationToExternalUser(
                $message,
                (string) $userId,
                null,
                $data ?: null,
                null,
                $sendAt,
                $heading
            );
        } catch (\Exception $e) {}
    }

    /**
     * Send notification to all users with a specific role
     *
     * @param int $roleId
     * @param string $message
     * @param string $heading
     * @param array $data
     * @return mixed
     */
    public function sendToRole(int $roleId, string $message, string $heading = 'JobHero', array $data = [])
    {
        try { return OneSignal::sendNotificationUsingTags(
            $message,
            [
                ['field' => 'tag', 'key' => 'iChamba_Role', 'relation' => '=', 'value' => (string) $roleId]
            ],
            null,
            null,
            null,
            null,
            $heading,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            $data
        ); } catch (\Exception $e) {}
    }

    /**
     * Notification types for contracts
     */
    public function notifyContractHired(int $supplierId, string $address)
    {
        return $this->sendToUser(
            $supplierId,
            "Has sido contratado para un servicio. Dirígete a la sección de postulaciones contratadas para más detalles.",
            "¡Nuevo Contrato!"
        );
    }

    public function notifyContractStarted(int $userId, string $address, string $date)
    {
        return $this->sendToUser(
            $userId,
            "El servicio en {$address} el día {$date} ha sido iniciado. Dirígete a la sección de servicios contratados para más detalles.",
            "Servicio Iniciado"
        );
    }

    public function notifyContractCancelled(int $supplierId, string $address, string $date)
    {
        return $this->sendToUser(
            $supplierId,
            "El servicio en {$address} el día {$date} ha sido cancelado. Dirígete a la sección de servicios contratados para más detalles.",
            "Servicio Cancelado"
        );
    }

    public function notifySupplierArrived(int $clientId, string $address)
    {
        return $this->sendToUser(
            $clientId,
            "El proveedor para el servicio en {$address} ha llegado. Dirígete a la sección de contratos confirmados para más detalles.",
            "Proveedor ha llegado"
        );
    }

    public function notifyAppointmentReminder(int $userId, string $address, int $minutesBefore = 30)
    {
        return $this->sendToUser(
            $userId,
            "Tienes un servicio agendado hoy en {$address} en {$minutesBefore} minutos. Dirígete a la sección de contratos confirmados para más detalles.",
            "Recordatorio de Cita"
        );
    }

    public function notifyNewPostulation(int $supplierId)
    {
        return $this->sendToUser(
            $supplierId,
            "Hay una nueva postulación disponible en tu área. Dirígete a la sección de postulaciones para ver más detalles.",
            "Nueva Postulación"
        );
    }
}
