<?php declare(strict_types=1);

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

    public function executar(int $idProposta, array $mapNumeroItemCar = []): array
    {
        $cars = (new Seguro_Model_ItensSeguradosCAR())->mapItemSeguradoCarsByProposta(
            (int) $idProposta,
            true,
            false,
            'nr_item_segurado'
        );
        $itens = (new Seguro_Model_ItensSegurados())->getAllByProposta((int) $idProposta);

        $errosMapeados = [];

        foreach ($itens as $item) {
             if (array_key_exists($item['nr_item_segurado'], $cars)) {
                $car = $cars[$item['nr_item_segurado']][0];
                $erro = $this->validarCar(
                    $item,
                    $car,
                    empty($mapNumeroItemCar) ? $cars : $mapNumeroItemCar
                );

                if (!empty($erro)) {
                    $errosMapeados[$item['nr_item_segurado']] = $erro;
                }
            }
        }

        return $errosMapeados;
    }

    private function validarCar(
        array $item,
        array $car,
        array $mapNumeroItemCar
    ): String {
        $erro = '';

        /**
         * Verifica se CAR salvo possui referência no banco.
         * Verifica se arquivo existe.
         * Verifica se item já tinha CAR e esse CAR foi alterado (precisa salvar novo arquivo).
         */
        if (
            $car['fl_manual']
            && (
                empty($car['ds_arquivo_car_manual'])
                || !file_exists(Seguro_Service_SalvarCarManual::UPLOAD_PATH . "/{$car['ds_arquivo_car_manual']}")
                || (
                    $mapNumeroItemCar[$car['nr_item_segurado']]
                    && $mapNumeroItemCar[$car['nr_item_segurado']] != $car['ds_car']
                )
            )
        ) {
            $erro = "{$item['ds_item_segurado']} - possui CAR manual sem documento vinculado.";
        }

        return $erro;
    }
}