<?php declare(strict_types=1);

class Seguro_Service_SalvarCarManual
{
    const UPLOAD_PATH = APPLICATION_PATH.'/upload_files/documento_car_manual';

    public function executar(int $idProposta, string $numeroCar, array $numerosItens): array
    {
        $modelItemSegurado = new Seguro_Model_ItensSegurados();
        $modelItemSeguradoCar = new Seguro_Model_ItensSeguradosCAR();

        $idPropostaMae = (new Seguro_Model_Propostas())->getIdPropostaMae($idProposta);

        $map = $modelItemSegurado->mapNumeroItemToItemSegurado($idProposta);

        $numerosItensSelecionados = [];
        foreach ($numerosItens as $numero) {
            $numerosItensSelecionados[$numero] = true;
        }

        $carsInfo = $modelItemSeguradoCar->getCarsByNumerosItens($idProposta, $numerosItens);
        
        $modelItemSeguradoCar->deleteCarsManuais($idProposta, $numerosItens);

        $fileArr =  explode('.', $_FILES['file']['name']);

        $cars = [];

        foreach ($numerosItens as $numero) {
            $idItemSegurado = $map[$numero]['id'];
            
            $novoCar = [
                'id_item_segurado' => $idItemSegurado,
                'ds_car' => Agro_Util::carUnmask($numeroCar),
                'ds_arquivo_car_manual' => $idPropostaMae . '-'. Agro_Util::carUnmask($numeroCar) . ".{$fileArr[1]}",
                'fl_selecionado' => true,
                'fl_manual' => true,
                'nr_item_segurado' => $numero // não existe na tabela do CAR, é só para utilizar no front
            ];

            $id = $modelItemSeguradoCar->save($novoCar);
            $cars[$numero] = $novoCar;

            if (!$id) {
                throw new Exception('Erro ao salvar CAR manual', 1);
            }
        }

        $this->uploadDocumento($idPropostaMae, $carsInfo, $numeroCar);

        return $cars;
    }

    private function uploadDocumento(int $idPropostaMae, array $carsInfo, string $numeroCar): void
    {
        $upload = new Zend_File_Transfer_Adapter_Http();

        if (!is_dir(self::UPLOAD_PATH)) {
            mkdir(self::UPLOAD_PATH, 0777, true);
        }

        $upload->setDestination(self::UPLOAD_PATH);
        $fileInfo = $upload->getFileInfo();

        $extension = explode('.', $fileInfo['file']['name'])[1];

        $upload->addFilter('Rename', [
            'target'    => self::UPLOAD_PATH . "/{$idPropostaMae}-{$numeroCar}.{$extension}",
            'overwrite' => true
        ]);

        $upload->addValidator('Size', false, ['max' => '5MB']);
        $upload->addValidator(
            'Extension',
            false,
            ['png', 'jpg', 'jpeg', 'pdf', 'doc', 'docx']
        );

        if (!$upload->isValid()) {
            throw new Exception('Arquivo deve ter no máximo 5MB e ter uma das seguintes extensões: png, jpg, jpeg, pdf, doc, docx.', 1);
        }
        
        // Se arquivos válidos, deleta arquivos antigos
        foreach ($carsInfo as $car) {
            $arquivo = self::UPLOAD_PATH.'/'.$car['ds_arquivo_car_manual'];
            
            if (file_exists($arquivo)) {
                unlink($arquivo);
            }
        }
    
        $uploaded = $upload->receive();

        if (!$uploaded) {
            throw new Exception('Erro ao salvar documento');
        }
    }
}