<?php
/**
 * WhatsJet
 *
 * This file is part of the WhatsJet software package developed and licensed by livelyworks.
 *
 * You must have a valid license to use this software.
 *
 * © 2025 livelyworks. All rights reserved.
 * Redistribution or resale of this file, in whole or in part, is prohibited without prior written permission from the author.
 *
 * For support or inquiries, contact: contact@livelyworks.net
 *
 * @package     WhatsJet
 * @author      livelyworks <contact@livelyworks.net>
 * @copyright   Copyright (c) 2025, livelyworks
 * @website     https://livelyworks.net
 */


namespace App\Yantrana\Base;

use App\Yantrana\__Laraware\Core\CoreMailer;
use App\Yantrana\Components\User\Repositories\UserRepository;
use Exception;
use Log;

/**
 * Base Mailer
 *--------------------------------------------------------------------------- */
class BaseMailer extends CoreMailer
{
    /**
     * @var UserRepository - User Repository
     */
    protected $userRepository;

    /**
     * Constructor.
     *
     * @param  UserRepository  $userRepository  - User Repository
     *-----------------------------------------------------------------------*/
    public function __construct(UserRepository $userRepository)
    {
        $this->userRepository = $userRepository;
    }

    /**
     * Notify Administrator.
     *
     * @param  sting  $subject.
     * @param  sting  $emailView.
     * @param  array  $messageData.
     * @return array.
     */
    public function notifyAdmin($subject, $emailView, $messageData = [], $messageType = 1)
    {
        $messageData['emailsTemplate'] = 'emails.'.$emailView;

        $messageData['mailForAdmin'] = true;
        $messageData['mailForCustomer'] = false;

        $adminEmails = [
            1 => getAppSettings('contact_email'),
            2 => getAppSettings('contact_email'),
        ];

        if (__isEmpty($adminEmails[$messageType])) {
            return false;
        }

        try {
            return $this->send([
                'recipients' => $adminEmails[$messageType],
                'subject' => $subject, //$subject,
                'view' => 'emails.index',
                'from' => $adminEmails[$messageType],
                'messageData' => $messageData,
                'replyTo' => __ifIsset($messageData['senderEmail'])
                    ? [$messageData['senderEmail'], $messageData['userName']]
                    : [],
            ]);
        } catch (Exception $e) {
            if (env('APP_DEBUG', false)) {
                Log::debug($e->getMessage());
            }

            return false;
        }
    }

    /**
     * Notify Customer.
     *
     * @param  sting  $subject.
     * @param  sting  $emailView.
     * @param  array  $messageData.
     * @param  mixed  $customerEmailOrId.
     * @return array.
     */
    public function notifyToUser($subject, $emailView, $messageData = [], $customerEmailOrId = null)
    {
        $customerName = isset($messageData['name']) ? $messageData['name'] : null;

        if (isLoggedIn()) {
            $userAuthInfo = getUserAuthInfo();
            $customerEmail = $userAuthInfo['profile']['email'];
            $customerName = $userAuthInfo['profile']['full_name'];
        }
        // if customer email or id sent
        if ($customerEmailOrId) {
            // set it as customer email address
            $customerEmail = $customerEmailOrId;

            // if its a user id then find user & get email address of it
            if (is_numeric($customerEmailOrId)) {
                if (str_contains($customerEmailOrId, '@')) {
                    $userInfo = $this->userRepository->fetchIt([
                        'email' => $customerEmailOrId,
                    ]);
                } else {
                    $userInfo = $this->userRepository->fetchIt($customerEmailOrId);
                }

                $customerEmail = $userInfo->email;
                $customerName = $userInfo->first_name.' '.$userInfo->last_name;
            }
        }

        if (! $customerEmail) {
            __logDebug('Customer Email is required for - ' . $customerEmailOrId);
            return false;
        }

        if (! $customerName) {
            $customerName = $customerEmail;
        }

        $messageData['emailsTemplate'] = 'emails.'.$emailView;
        $messageData['mailForAdmin'] = false;
        $messageData['mailForCustomer'] = true;

        try {
            return $this->send([
                'recipients' => $customerEmail,
                'replyTo' => config('__misc.mail_from'),
                'subject' => $subject,
                'view' => 'emails.index',
                'from' => config('__misc.mail_from'),
                'messageData' => $messageData,
            ]);
        } catch (Exception $e) {
            __logDebug($e->getMessage());
            return false;
        }
    }
}
