<?php

class MensagemService
{
    public static function enviarEmailCredenciais($pessoa, $clinica)
    {
        $template = TemplateClinica::getTemplate('EMAIL_CREDENCIAIS', $clinica->id);

        if ($template && $template->habilitado == 'T' && $pessoa->email)
        {
            $config = EmailConfig::where('clinica_id', '=', $clinica->id)->first();
        
            if (empty($config))
            {
                throw new Exception('E-mail não configurado! Veja o cadastro da clínica');
            }
 
            $cliente = new EmailClient($config);
            
            $title = TemplateClinica::replace($pessoa, $template->titulo, $clinica);
            $message = TemplateClinica::replace($pessoa, $template->template, $clinica);

            $cliente->send($pessoa->email, $title, $message);
        }
    }
    
    public static function canEnviarWhatsappLembreteConsulta($agendamento)
    {
        if ($agendamento->estado_agenda_id != EstadoAgenda::CONFIRMADO)
        {
            return false;
        }
        
        $template = TemplateClinica::getTemplate('WHATSAPP_LEMBRETE_CONSULTA', TSession::getValue('userunitid'));
        
        if ($template && $template->habilitado == 'T' && $agendamento->paciente->telefone)
        {
            return true;
        }
        
        
        return false;
    }
    
    public static function canEnviarWhatsappConfirmacao($agendamento)
    {
        if ($agendamento->estado_agenda_id != EstadoAgenda::AGENDADO)
        {
            return false;
        }
        
        $template = TemplateClinica::getTemplate('WHATSAPP_CONFIRMACAO_AGENDAMENTO', TSession::getValue('userunitid'));
        
        if ($template && $template->habilitado == 'T' && $agendamento->paciente->telefone)
        {
            return true;
        }
        
        
        return false;
    }
    
    public static function canEnviarEmailConfirmacao($agendamento)
    {
        if ($agendamento->estado_agenda_id != EstadoAgenda::AGENDADO)
        {
            return false;
        }
        
        $template = TemplateClinica::getTemplate('EMAIL_CONFIRMACAO_AGENDAMENTO', TSession::getValue('userunitid'));
        
        if ($template && $template->habilitado == 'T' && $agendamento->paciente->email)
        {
            return true;
        }
        
        return false;
    }
    
    public static function canEnviarEmailLembreteConsulta($agendamento)
    {
        if ($agendamento->estado_agenda_id != EstadoAgenda::CONFIRMADO)
        {
            return false;
        }
        
        $template = TemplateClinica::getTemplate('EMAIL_LEMBRETE_CONSULTA', TSession::getValue('userunitid'));
        
        if ($template && $template->habilitado == 'T' && $agendamento->paciente->email)
        {
            return true;
        }
        
        return false;
    }
    
    public static function enviarWhatsappLembreteConsulta($agendamento)
    {
        $template = TemplateClinica::getTemplate('WHATSAPP_LEMBRETE_CONSULTA', TSession::getValue('userunitid'));

        if ($template && $template->habilitado == 'T' && $agendamento->paciente->telefone)
        {
            self::enviarWhatsapp($agendamento, $template->titulo, $template->template, $template->getTemplateAcaos(), $template->id);
        }
    }
    
    public static function enviarEmailConfirmacao($agendamento)
    {
        $template = TemplateClinica::getTemplate('EMAIL_CONFIRMACAO_AGENDAMENTO', TSession::getValue('userunitid'));

        if ($template && $template->habilitado == 'T' && $agendamento->paciente->email)
        {
            self::enviarEmail($agendamento, $template->titulo, $template->template, $template->id);
        }
    }
    
    public static function enviarWhatsappConfirmacao($agendamento)
    {
        $template = TemplateClinica::getTemplate('WHATSAPP_CONFIRMACAO_AGENDAMENTO', TSession::getValue('userunitid'));

        if ($template && $template->habilitado == 'T' && $agendamento->paciente->telefone)
        {
            self::enviarWhatsapp($agendamento, $template->titulo, $template->template, $template->getTemplateAcaos(), $template->id);
        }
    }
    
    public static function enviarEmailLembreteConsulta($agendamento)
    {
        $template = TemplateClinica::getTemplate('EMAIL_LEMBRETE_CONSULTA', TSession::getValue('userunitid'));

        if ($template && $template->habilitado == 'T' && $agendamento->paciente->email)
        {
            self::enviarEmail($agendamento, $template->titulo, $template->template, $template->id);
        }
    }
    
    
    public static function enviarWhatsapp($agendamento, $titulo, $template, $acoes, $template_clinica_id)
    {
        $config = WhatsappConfig::where('(SELECT system_unit_id FROM clinica WHERE clinica.id = clinica_id)', '=', TSession::getValue('userunitid'))->first();
        
        if (empty($config))
        {
            throw new Exception('WhatsApp não configurado! Veja o cadastro da clínica');
        }
        
        if ($agendamento->paciente->aceita_receber_mensagen_whatsapp != 'T')
        {
            throw new Exception('O paciente não aceita receber mensagens de whatsapp');
        }
        
        $cliente = new WhatsAppClient($config);
        
        $title = TemplateClinica::replace($agendamento, $titulo);
        $message = TemplateClinica::replace($agendamento, $template);
        
        $mensagem = new Mensagem();
        $mensagem->agendamento_id = $agendamento->id;
        $mensagem->template_clinica_id = $template_clinica_id;
        $mensagem->system_user_id = TSession::getValue('userid');
        $mensagem->titulo = $title;
        $mensagem->tipo_mensagem = TemplateClinica::WHATSAPP;
        $mensagem->template = $message;
        $mensagem->store();
        
        $actions = [];
        
        if ($acoes)
        {
            foreach ($acoes as $acao)
            {
                $acao->url = TemplateClinica::replace($agendamento, $acao->url);
                $acao->label = TemplateClinica::replace($agendamento, $acao->label);
                
                $actions[$acao->url] = $acao->label;
                
                $mensageAcao = new MensagemAcao;
                $mensageAcao->mensagem_id = $mensagem->id;
                $mensageAcao->label = $acao->label;
                $mensageAcao->url = $acao->url;
                $mensageAcao->store();
            }
        }
        
        $cliente->send($agendamento->paciente->telefone, $message, $title, $actions);
    }
    
    public static function enviarEmail($agendamento, $titulo, $template, $template_clinica_id)
    {
        $config = EmailConfig::where('clinica_id', '=', TSession::getValue('userunitid'))->first();
        
        if (empty($config))
        {
            throw new Exception('E-mail não configurado! Veja o cadastro da clínica');
        }
        
        $cliente = new EmailClient($config);
        
        $title = TemplateClinica::replace($agendamento, $titulo);
        $message = TemplateClinica::replace($agendamento, $template);
        
        $mensagem = new Mensagem();
        $mensagem->agendamento_id = $agendamento->id;
        $mensagem->template_clinica_id = $template_clinica_id;
        $mensagem->system_user_id = TSession::getValue('userid');
        $mensagem->titulo = $title;
        $mensagem->tipo_mensagem = TemplateClinica::EMAIL;
        $mensagem->template = $message;
        $mensagem->store();
        
        $cliente->send($agendamento->paciente->email, $title, $message);
    }
}
