<?php
namespace Incoviba\Service\Contabilidad\Informe\Tesoreria\Output\Data;

class Movimientos
{
    public function __construct(protected array $ordenSociedades)
    {
        $this->dap = new class()
        {
            public array $ingresos = [];
            public array $egresos = [];
        };
    }
    public object $dap;
    public array $ingresos = [];
    public array $egresos = [];

    const INGRESOS = 'ingresos';
    const EGRESOS = 'egresos';
    public function addDap(string $tipo, array $movimientos): self
    {
        foreach ($movimientos as $movimiento) {
            $this->dap->{$tipo} []= $movimiento;
        }
        return $this;
    }
    public function updateDap(object $movimiento): void
    {
        foreach ($this->ingresos as $ingreso) {
            if ($movimiento->cuenta->inmobiliaria->rut !== $ingreso->cuenta->inmobiliaria->rut) {
                continue;
            }
            if ($movimiento->fecha->format('Y-m-d') !== $ingreso->fecha->format('Y-m-d')) {
                continue;
            }
            if ($movimiento->documento !== $ingreso->documento) {
                continue;
            }
            $ingreso->glosa = $movimiento->glosa;
            break;
        }
    }
    public function build(): array
    {
        $this->dap->ingresos = $this->sortBySociedades($this->dap->ingresos);
        $this->dap->egresos = $this->sortBySociedades($this->dap->egresos);
        $this->ingresos = $this->sortBySociedades($this->ingresos);
        $this->egresos = $this->sortBySociedades($this->egresos);
        return [
            'capital dap' => [
                'ingresos' => $this->dap->ingresos,
                'egresos' => $this->dap->egresos
            ],
            'ingresos' => $this->ingresos,
            'egresos' => $this->egresos
        ];
    }

    private function sortBySociedades(array $movimientos): array
    {
        $temp = [];
        foreach ($this->ordenSociedades as $sociedad_rut) {
            $date = null;
            foreach ($movimientos as $movimiento) {
                if ($date === null) {
                    $date = $movimiento->fecha;
                }
                if ($movimiento->fecha !== $date) {
                    $date = $movimiento->fecha;
                }
                if ($movimiento->cuenta->inmobiliaria->rut === $sociedad_rut) {
                    $temp []= $movimiento;
                }
            }
        }
        foreach ($movimientos as $movimiento) {
            if (!in_array($movimiento, $temp)) {
                $temp []= $movimiento;
            }
        }
        return $temp;
    }
}
