<?php
include __DIR__ . '/../vendor/autoload.php';
include_once __dir__ .  '/../core/LogEvent.php';

class AIGenerator extends Core
{

    const API_KEY = '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';
    const DESCRIPTION_INSTRUCTION = array(
        'Atue como um profissional de RH e marketing para a empresa #company_name',
        'e crie uma descrição curta e direta de até 800 caracteres contando os espaços',
        'para os candidatos',
        'Use as informações e regras abaixos da vaga para criar a descrição.',
        "\tCargo a ser desempenhado: #job_occupation",
        "\tSobre o processo: #process_name",
        "\tNúmero de vagas: #vacancy_number",
        "\tMostrar nome da empresa no processo seletivo: #show_company_name",
        "\tRegime de contratação: #work_regime",
        "\tModelo de trabalho: #modalityjob",
        "\tNivel do cargo: #occupation_level",
        "\tDias de trabalho: #weekdays",
        "\tHorários de trabalho: #work_hours."
    );
    const REQUIREMENTS_INSTRUCTION = array(
        'Atue como um profissional de RH e marketing',
        'e crie uma lista de requisitos para a vaga, gere no máximo com 800 caracteres contando os espaços',
        'Use as informações e regras abaixos da vaga para criar a lista.',
        "\tCargo a ser desempenhado: #job_occupation",
        "\tSobre o processo: #process_name",
        "\tNivel do cargo: #occupation_level",
        "\tDias de trabalho: #weekdays",
        "\tHorários de trabalho: #work_hours."
    );
    const ACTIVITIES_INSTRUCTION = array(
        'Atue como um profissional de RH e marketing',
        'e crie uma lista com no máximo 800 caracteres contando os espaços',
        'listando atividades a serem desempenhadas pelo profissional para a vaga.',
        'Use as informações e regras abaixos da vaga para criar a lista.',
        "\tCargo a ser desempenhado: #job_occupation",
        "\tSobre o processo: #process_name",
        "\tModelo de trabalho: #modalityjob",
        "\tNivel do cargo: #occupation_level"
    );

    const BENEFITS_INSTRUCTION_PF = array(
        'Atue como um profissional de RH e marketing',
        'e crie uma lista com sugestões dos benefícios que o candidato',
        'poderá ter ao ser selecionado para a vaga de emprego.',
        'Crie uma lista curta e direta para leitura de no máximo 800 caracteres,',
        'use as informações e regras abaixos da vaga para criar os benefícios.',
        "\tRegime de contratação: #work_regime",
        "\tModelo de trabalho: #modalityjob",
        "\tNivel do cargo: #occupation_level",
        "\tDias de trabalho: #weekdays",
        "\tHorários de trabalho: #work_hours.",
        "De as seguintes sugestões de benéficios para as pessoas físicas",
        "\tVale alimentação",
        "\tVale transporte",
        "\tFérias remuneradas",
        "\te outros que possam ser incluidos",
    );
	
	const BENEFITS_INSTRUCTION_PJ = array(
        'Atue como um profissional de RH e marketing',
        'e crie uma lista com sugestões dos benefícios que o candidato',
        'poderá ter ao ser selecionado para a vaga de emprego.',
        'Crie uma lista curta e direta para leitura de no máximo 800 caracteres,',
        'use as informações e regras abaixos da vaga para criar os benefícios.',
        "\tRegime de contratação: #work_regime",
        "\tModelo de trabalho: #modalityjob",
        "\tNivel do cargo: #occupation_level",
        "\tDias de trabalho: #weekdays",
        "\tHorários de trabalho: #work_hours."
    );
    
    const REPORT_PROCESS = array(
        'Relatório de fit cultural, comportamental e qualificações',
        'Informações do candidato:',
        "\tIdade: #idade",
        "\tSexo: #sexo",
        "\tSobre o candidato: #sobre",
        "\tCargos desejados:  #cargos",
        "\tExperiências profissionais: #ex_profissionais.",
        "\tExperiências Escolares: #ex_escolares",
        "\tQuestionário Fit Cultural e Comportamental: #resp_fit",
        "\tInformações do Processo seletivo: #info_process",
        'Faça uma análise da escrita considerando ortografia, lógica, contexto, se o candidato se expressa bem, se existe coerencia nas informações como experiências e formações e o comportamento.',
        'Faça uma análise do fit cultural e comportamental e também das experiência profissionais e escolares para basear as suas respostas, não confie nas informações do candidato pois elas podem ser falsas, por isso tente basear as suas respostas em análises de todo o conjunto.',
        'Faça um relatório focado em uma análise para o gestor e recrutador do fit cultural, comportamental e qualificações desse candidato.',
        'Responda com os seguintes tópicos: Informações do Candidato, Competências Principais, Análise do Fit Cultural e Comportamental, Análise de Qualificações, Conclusão, Pontos Fortes, Pontos de Atenção e Recomendação final.',
    );
    
    const REQUIREMENTS_KEY_INSTRUCTION = array(
        'Você é um profissional de RH com foco em marketing de vagas.',
        'Crie uma descrição curta, iniciando sempre com o nome do cargo, seguido de uma vírgula e um complemento com palavras-chave relevantes extraídas dos requisitos da vaga.',
        'A descrição deve ser natural, clara e atrativa, e deve ajudar o candidato a entender rapidamente o que é necessário 
para a vaga.',
        'Evite apenas listar palavras soltas; monte uma frase concisa e fluida.',
        'O texto completo (cargo + complemento) deve ter no máximo 70 caracteres, incluindo espaços.',
        'Use as informações abaixo para extrair as palavras-chave e gerar a descrição:',
        "\tNome do cargo: #job_occupation",
        "\tTexto com requisitos da vaga: #text_requirement"
    );
    
    const LEGEND_INSTRUCTION = array(
        'Atue como um profissional de RH e marketing',
        'Crie uma legenda objetiva para a arte que será postada nas redes sociais, com o intuito de cativar os candidatos e incentivá-los a participar do processo seletivo.',
        'Lembrando de usar as informações e regras abaixo da vaga para criar a legenda com no máximo 250 caracteres e não incluir emojis.',
        "\tCargo a ser desempenhado: #job_occupation",
        "\tNúmero de vagas: #vacancy_number",
        "\tRegime de contratação: #work_regime",
        "\tModelo de trabalho: #modalityjob"
    );

    private $options = [
        // 'model' => 'gpt-4o-mini',
        'model' => 'gpt-4.1-mini',
        'messages' => [
            ['role' => 'system', 'content' => ''],
        ],
        'max_tokens' => 2000,
        'temperature' => 0.5
    ];

    function completationDescription()
    {
        $user_id        = $_POST['userId'];
        $name           = $_POST['name'];
        $qtd            = $_POST['qtd'];
        $company_name   = $_POST['companyname'];
        $occupation_level    = $_POST['jobLevel'];
        $sinonimo       = $_POST['sinonimo'];
        $workregime     = $_POST['workregime'];
        $weekdays       = $_POST['weekdays'];
        $start_monday   = $_POST['startMonday'];
        $end_monday     = $_POST['endMonday'];
        $show_company_name = $_POST['showCompanyName'] ?? false;
        $modalityjob = $_POST['modalityjob'];

        $instructions = implode("\n", AIGenerator::DESCRIPTION_INSTRUCTION);
        $instructions = str_replace('#process_name', $name, $instructions);
        $instructions = str_replace('#vacancy_number', $qtd, $instructions);
        $instructions = str_replace('#show_company_name', $show_company_name == true ? 'Sim' : 'Não', $instructions);
        $instructions = str_replace('#company_name', $company_name, $instructions);
        $instructions = str_replace('#occupation_level', $occupation_level, $instructions);
        $instructions = str_replace('#job_occupation', $sinonimo, $instructions);
        $instructions = str_replace('#modalityjob', $modalityjob, $instructions);
        $instructions = str_replace('#work_regime', $workregime, $instructions);
        $instructions = str_replace('#weekdays', implode(', ', json_decode($weekdays)), $instructions);
        $instructions = str_replace('#work_hours', "das {$start_monday} até as {$end_monday}", $instructions);

        $client = OpenAI::client(AIGenerator::API_KEY);
        $this->options['messages'][0]['content'] = $instructions;
        $response = $client->chat()->create($this->options);

        $text_output = '';
        foreach ($response->choices as $result)
            $text_output .= $result->message->content;

        $text_output = str_replace('**', '', $text_output);
        
        //$this->logIAUsage('descrição da vaga', $user_id, $user_id);

        return [
            'type' => 'OK',
            'data' => ['text' => $text_output]
        ];
    }

    function completationRequirements()
    {

        $user_id        = $_POST['userId'];
        $name           = $_POST['name'];
        $qtd            = $_POST['qtd'];
        $company_name   = $_POST['companyname'];
        $occupation_level    = $_POST['jobLevel'];
        $sinonimo       = $_POST['sinonimo'];
        $workregime     = $_POST['workregime'];
        $weekdays       = $_POST['weekdays'];
        $start_monday   = $_POST['startMonday'];
        $end_monday     = $_POST['endMonday'];
        $show_company_name = $_POST['showCompanyName'] ?? false;
        $modalityjob = $_POST['modalityjob'];

        $instructions = implode("\n", AIGenerator::REQUIREMENTS_INSTRUCTION);
        $instructions = str_replace('#process_name', $name, $instructions);
        $instructions = str_replace('#vacancy_number', $qtd, $instructions);
        $instructions = str_replace('#show_company_name', $show_company_name == true ? 'Sim' : 'Não', $instructions);
        $instructions = str_replace('#company_name', $company_name, $instructions);
        $instructions = str_replace('#occupation_level', $occupation_level, $instructions);
        $instructions = str_replace('#job_occupation', $sinonimo, $instructions);
        $instructions = str_replace('#modalityjob', $modalityjob, $instructions);
        $instructions = str_replace('#work_regime', $workregime, $instructions);
        $instructions = str_replace('#weekdays', implode(', ', json_decode($weekdays)), $instructions);
        $instructions = str_replace('#work_hours', "das {$start_monday} até as {$end_monday}", $instructions);

        $client = OpenAI::client(AIGenerator::API_KEY);
        $this->options['messages'][0]['content'] = $instructions;
        $response = $client->chat()->create($this->options);
        $text_output = '';
        foreach ($response->choices as $result)
            $text_output .= $result->message->content;

        $text_output = str_replace('**', '', $text_output);
        //$this->logIAUsage('requisitos da vaga', $user_id, $user_id);

        return [
            'type' => 'OK',
            'data' => ['text' => $text_output]
        ];
    }

    function completationActivities()
    {

        $user_id        = $_POST['userId'];
        $name           = $_POST['name'];
        $qtd            = $_POST['qtd'];
        $company_name   = $_POST['companyname'];
        $occupation_level    = $_POST['jobLevel'];
        $sinonimo       = $_POST['sinonimo'];
        $workregime     = $_POST['workregime'];
        $weekdays       = $_POST['weekdays'];
        $start_monday   = $_POST['startMonday'];
        $end_monday     = $_POST['endMonday'];
        $show_company_name     = $_POST['showCompanyName'] ?? false;
        $modalityjob = $_POST['modalityjob'];

        $instructions = implode("\n", AIGenerator::ACTIVITIES_INSTRUCTION);
        $instructions = str_replace('#process_name', $name, $instructions);
        $instructions = str_replace('#vacancy_number', $qtd, $instructions);
        $instructions = str_replace('#show_company_name', $show_company_name == true ? 'Sim' : 'Não', $instructions);
        $instructions = str_replace('#company_name', $company_name, $instructions);
        $instructions = str_replace('#occupation_level', $occupation_level, $instructions);
        $instructions = str_replace('#job_occupation', $sinonimo, $instructions);
        $instructions = str_replace('#modalityjob', $modalityjob, $instructions);
        $instructions = str_replace('#work_regime', $workregime, $instructions);
        $instructions = str_replace('#weekdays', implode(', ', json_decode($weekdays)), $instructions);
        $instructions = str_replace('#work_hours', "das {$start_monday} até as {$end_monday}", $instructions);

        $client = OpenAI::client(AIGenerator::API_KEY);
        $this->options['messages'][0]['content'] = $instructions;
        $response = $client->chat()->create($this->options);;

        $text_output = '';
        foreach ($response->choices as $result)
            $text_output .= $result->message->content;

        $text_output = str_replace('**', '', $text_output);
        //$this->logIAUsage('atividades da vaga', $user_id, $user_id);

        return [
            'type' => 'OK',
            'data' => ['text' => $text_output]
        ];
    }

    function completationBenefits()
    {

        $user_id        = $_POST['userId'];
        $occupation_level    = $_POST['jobLevel'];
        $workregime     = $_POST['workregime'];
        $weekdays       = $_POST['weekdays'];
        $start_monday   = $_POST['startMonday'];
        $end_monday     = $_POST['endMonday'];
        $modalityjob = $_POST['modalityjob'];

        if($workregime == 'CLT')
			$instructions = implode("\n", AIGenerator::BENEFITS_INSTRUCTION_PF);
		else
			$instructions = implode("\n", AIGenerator::BENEFITS_INSTRUCTION_PJ);
        $instructions = str_replace('#occupation_level', $occupation_level, $instructions);
        $instructions = str_replace('#modalityjob', $modalityjob, $instructions);
        $instructions = str_replace('#work_regime', $workregime, $instructions);
        $instructions = str_replace('#weekdays', implode(', ', json_decode($weekdays)), $instructions);
        $instructions = str_replace('#work_hours', "das {$start_monday} até as {$end_monday}", $instructions);
        
        $client = OpenAI::client(AIGenerator::API_KEY);
        $this->options['messages'][0]['content'] = $instructions;
        
        $response = $client->chat()->create($this->options);;

        $text_output = '';
        foreach ($response->choices as $result)
            $text_output .= $result->message->content;

        $text_output = str_replace('**', '', $text_output);
        //$this->logIAUsage('beneficios da vaga', $user_id, $user_id);

        return [
            'type' => 'OK',
            'data' => ['text' => $text_output]
        ];
    }
    
    function completationReports() {
                
        $user_id            = $_POST['userId'];
        $id_candidato       = $_POST['id'];
        $idade              = $_POST['idade'];        
        $sexo               = $_POST['sexo'];
        $sobre              = $_POST['sobre'];        
        $cargos             = $_POST['cargos'] ?? '';
        $ex_profissionais   = $_POST['ex_profissionais'];        
        $ex_escolares       = $_POST['ex_escolares'];
        $resp_fit           = $_POST['resp_fit'];
        $info_process       = $_POST['info_process'] ?? 'Nenhum';
        $id_processo        = $_POST['id_processo'];
    
        $instructions = implode("\n", AIGenerator::REPORT_PROCESS);        
        $instructions = str_replace('#idade', $idade, $instructions);        
        $instructions = str_replace('#sexo', $sexo, $instructions);
        $instructions = str_replace('#sobre', $sobre, $instructions);
        $instructions = str_replace('#cargos', $cargos, $instructions);
        $instructions = str_replace('#ex_profissionais', $ex_profissionais, $instructions);
        $instructions = str_replace('#ex_escolares', $ex_escolares, $instructions);
        $instructions = str_replace('#resp_fit', $resp_fit, $instructions);
        $instructions = str_replace('#info_process', $info_process, $instructions);
        
        $client = OpenAI::client(AIGenerator::API_KEY);
        $this->options['messages'][0]['content'] = $instructions;
        //$this->options['temperature'] = 0;
        file_put_contents('OPTIONS.txt', print_r($this->options, true));
        file_put_contents('INS.txt', print_r($instructions, true));
        $response = $client->chat()->create($this->options);;
        
        $text_output = '';
        foreach ($response->choices as $result)
            $text_output .= $result->message->content;
            
        $text_output = preg_replace('/### (.*)/', '<h3>$1</h3>', $text_output);
        $text_output = preg_replace('/## (.*)/', '<h2>$1</h2>', $text_output);
        $text_output = preg_replace('/# (.*)/', '<h1>$1</h1>', $text_output);
        $text_output = preg_replace('/\*\*(.*?)\*\*/', '<strong>$1</strong>', $text_output);
        $text_output = str_replace("\n", "<br>", $text_output);
        $text_output = str_replace("#", "", $text_output);
        
        $sql = "UPDATE `process_list_lead` SET `report`= :report WHERE lead = :lead_id AND process_list = :process_list";
        $stmt = parent::$conn->prepare($sql);
        $stmt->execute([
            'lead_id' => $id_candidato, 
            'report' => $text_output,
            'process_list' => $id_processo
        ]);

        $sql = "SELECT * FROM leads WHERE id = :id";
        $stmt = parent::$conn->prepare($sql);
        $stmt->execute(['id' => $id_candidato]);
        $lead = $stmt->fetch(PDO::FETCH_ASSOC);        
        $insert_id = $lead['id'];
        $name = strtoupper($lead['firstname'] . ' ' . $lead['lastname']);

        $title = "Novo relatório de compatibilidade gerado para o candidato $name";
        $url = "/recruiter/process";
        
        LogEvent::log($user_id, $insert_id, $url, $title, LogEvent::CREATE_REPORT_COMPATIBILITY);
        
        return [
            'type' => 'OK',
            'data' => ['text' => $text_output] 
        ];

    }
    
    function descriptionCreative(){
        $user_id        = $_POST['userId'];
        $process_id     = $_POST['process_id'];
        $requirements   = $_POST['requirements'];        
        $sinonimo       = $_POST['sinonimo'];
        
        $instructionsKey = implode("\n", AIGenerator::REQUIREMENTS_KEY_INSTRUCTION);
        $instructionsKey = str_replace('#job_occupation', $sinonimo, $instructionsKey);
        $instructionsKey = str_replace('#text_requirement', $requirements, $instructionsKey);
        
        $client2 = OpenAI::client(AIGenerator::API_KEY);
        $this->options['messages'][0]['content'] = $instructionsKey;
        $response2 = $client2->chat()->create($this->options);
        
        $text_key_output = '';
        foreach ($response2->choices as $result2){
            $text_key_output .= $result2->message->content;
        }
        
        $sql = "UPDATE `process_list` SET `creative_key`= :keys WHERE id = :process_id";
        $stmt = parent::$conn->prepare($sql);
        $stmt->execute(['keys' => $text_key_output, 'process_id' => $process_id]);

        return [
            'type' => 'OK',
            'text' => $text_key_output
        ];
    }

    private function logIAUsage($report_desc, $user_id, $process_id, $log_type = LogEvent::AI_PROCESS_CREATE) {

        $title = "Usou IA para gerar \"$report_desc\"";
        $url = "/recruiter/process";
        
        LogEvent::log($user_id, $process_id, $url, $title, $log_type);

    }

    function legendCreative(){
        $user_id        = $_POST['userId'];
        $process_id     = $_POST['process_id'];
        $qtd            = $_POST['qtd'];
        $modalityjob    = $_POST['modalityjob'];
        $workregime     = $_POST['workregime'];
        $sinonimo       = $_POST['sinonimo'];
        
        $instructionsKey = implode("\n", AIGenerator::LEGEND_INSTRUCTION);
        $instructionsKey = str_replace('#job_occupation', $sinonimo, $instructionsKey);
        $instructionsKey = str_replace('#vacancy_number', $qtd, $instructionsKey);
        $instructionsKey = str_replace('#modalityjob', $modalityjob, $instructionsKey);
        $instructionsKey = str_replace('#work_regime', $workregime, $instructionsKey);
        
        $client2 = OpenAI::client(AIGenerator::API_KEY);
        $this->options['messages'][0]['content'] = $instructionsKey;
        $response2 = $client2->chat()->create($this->options);
        
        $text_key_output = '';
        foreach ($response2->choices as $result2){
            $text_key_output .= $result2->message->content;
        }
        
        $this->logIAUsage('legenda do criativo', $user_id, $process_id, LogEvent::AI_CREATIVE);

        return [
            'type' => 'OK',
            'data' => ['text' => $text_key_output] 
        ];

    }

}
