<?php
include_once __dir__ . '/../vendor/autoload.php';
include_once __dir__ .  '/../core/AICore.php';
include_once __dir__ .  '/../core/CurriculoIACore.php';

use Smalot\PdfParser\Parser;
use Dompdf\Dompdf;

class CurriculoAI extends Core
{

    use CurriculoIACore;

    const INSTRUCTION = array(
        "Analise o dados do currículo de candidatos para vagas de empregos e retorne as informações requisitadas nas regras abaixo:",
        "Deve ser retornado um JSON com o seguintes atributos:",
        "",
        '{	',
        '	"fullname": <nome do candidato>,',
        '	"email": <email do candidato - se houver>,',
        '	"educationHistoric": [',
        '        {',
        '            "name": <nome do curso>,',
        '            "institution": <nome da instituição de ensino>,',
        '            "startDate": <data do inicio do curso - formato YYYY-MM>,',
        '            "endDate": <data de termino do curso, se houver - formato YYYY-MM>,',
        '            "description": <uma descrição gerada com as informações do curso>',
        '        }',
        '    ],',
        '    "professionalHistoric": [',
        '        {',
        '            "name": <nome do cargo emprego>,',
        '            "company": <nome da empresa>,',
        '            "startDate": <data do inicio do emprego - formato YYYY-MM>,',
        '            "endDate": <data de termino do emprego, se houver - formato YYYY-MM>,',
        '            "description": <uma descrição gerada com as informações do cargo>',
        '        }',
        '    ]',
        '}',
        "",
        "Retorne os dados possíveis encontrado no texto informado, com correções ortográficas e melhorando a descrições dos cargos e escolaridade para gerar uma escrita formal e de qualidade para ser analisado pelos RH das empresas."
    );


    function upload()
    {

        try {

            if (isset($_FILES['curriculo']) && $_FILES['curriculo']['error'] === UPLOAD_ERR_OK) {

                $parser = new Parser();
                $pdf = $parser->parseFile($_FILES['curriculo']['tmp_name']);
                
                $text = '';
                foreach ($pdf->getPages() as $page) {
                    $text .= $page->getText();
                }
                
                if (!preg_match('//u', $text)) {    
                    $text = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $text);
                }
                
                try {

                    $payload = $this->start(CurriculoAI::INSTRUCTION, $text);
                    $json = json_decode($payload, true);
                    $email = $_POST['email'];
                    
                    $sql = "SELECT id FROM leads WHERE email = :email";
                    $stmt = parent::$conn->prepare($sql);
                    $stmt->execute([':email' => $email]);
                    $lead = $stmt->fetch(PDO::FETCH_ASSOC);
                    $lead_id = $lead['id'];
                    
                    $this->saveCurriculoData($json, $lead_id);

                    $filepath =  __DIR__ . "/../uploads/curriculos/{$lead_id}.pdf";
                    
                    if(move_uploaded_file($_FILES['curriculo']['tmp_name'], $filepath)) {

                        $sql = "INSERT INTO leads_curriculo(lead_id, content, `json`, `path`) VALUES(:lead_id, :content, :json, :path)";
                        $stmt = parent::$conn->prepare($sql);
                        $stmt->execute([
                            ':lead_id' => $lead_id,
                            ':content' => $text,
                            ':json' => json_encode($json),
                            ':path' => $filepath
                        ]);
                        
                        $lead = $stmt->fetch(PDO::FETCH_ASSOC);

                    }
                    
                    return [
                        'type' => 'OK',
                        'result' => [
                            'json' => $json,
                            'userId' => $lead_id
                        ]
                    ];
                } catch(\Exception $err) {
                    
                    return [
                        'type' => 'ERROR'
                    ];
                }
            } else {
                return ['type' => 'ERROR'];
            }
        } catch (\Exception $err) {
            return ['type' => 'ERROR', 'message' => $err->getMessage()];
        }
    }
}
