<?php

class EstadoResultadoFechaQuery
{
    use AttributeAccess;

    protected $attributes;

    public function __construct($attributes)
    {
        $this->attributes = $attributes;
    }

    public function run()
    {
        if (empty($this->fecha_desde) || empty($this->fecha_hasta)) {
            return [[], true, 'Debe seleccionar una rango de fechas a consultar.'];
        }

        $where_total_cuenta = '';
        if ($this->cuenta_desde != null && $this->cuenta_hasta != null) {
            $where_cuenta = " AND cuenta BETWEEN '{$this->cuenta_desde}' AND '{$this->cuenta_hasta}'
                              AND titulo_mov = 2
                              OR (titulo_mov = 1 AND cuenta BETWEEN '1' AND '{$this->cuenta_hasta}')";
            $where_total_cuenta = " AND cuenta BETWEEN '{$this->cuenta_desde}' AND '{$this->cuenta_hasta}' ";
        }

        if ($this->nivel != null) {
            $where_nivel = ' AND nivel <= '.$this->nivel.' ';
        }

        if ($this->excluir_movimiento_cierre) {
            $movimiento_cierre = ' AND id_tipo_comprobante=1';
        } else {
            $movimiento_cierre = ' AND (id_tipo_comprobante=1 OR id_tipo_comprobante=3)';
        }

        if ($this->fecha_desde != null) {
            $where_fecha_ant = " AND fecha_comprobante < '{$this->fecha_desde}' ";
        }

        if ($this->fecha_desde != null && $this->fecha_hasta != null) {
            $where_fecha = " AND fecha_comprobante BETWEEN '{$this->fecha_desde}' AND '{$this->fecha_hasta}' ";
        }

        $config_contable = ['0' => 0, '1' => 1, '2' => 2, '3' => 3, '4' => 5, '5' => 7, '6' => 9, '7' => 11];

        $cuentas = CuentasConsolidada::model()->findAll([
            'condition' => "blnborrado = FALSE AND SUBSTRING(cuenta from 1 for 1) IN ('4','5') ".$where_nivel,
            'order' => 'cuenta ASC',
        ]);

        $datos = [];
        $datos['attributes'] = $this->attributes;
        $ejercicio = EjerciciosContables::model()->find('activo=1');
        $acum_total_anterior = 0;
        $acum_total_actual = 0;
        $acum_variacion = 0;

        $acum_ingresos_anterior = 0;
        $acum_ingresos_actual = 0;
        $acum_ingresos_variacion = 0;

        $acum_egresos_anterior = 0;
        $acum_egresos_actual = 0;
        $acum_egresos_variacion = 0;

        foreach ($cuentas as $cuenta) {
            // Trimestre anterior
            $model_total_anterior = DetalleAnalitico::model()->find([
                'select' => 'coalesce(sum(monto_debe), 0) - coalesce(sum(monto_haber), 0) as total_monto_anterior ',
                'condition' => "SUBSTRING('{$cuenta->cuenta}' from 1 for {$config_contable[$cuenta->nivel]}) = SUBSTRING(cuenta from 1 for {$config_contable[$cuenta->nivel]})
                                AND estatus_contab=1
                                AND activo=1
                                AND clvejercicio={$ejercicio->id}
                                AND blnborrado = FALSE
                                {$movimiento_cierre}
                                {$where_total_cuenta}
                                {$where_fecha_ant}",
            ]);

            //El detalle del trimestre actual
            $model_total = DetalleAnalitico::model()->find([
                'select' => "coalesce(sum(monto_debe), 0) - coalesce(sum(monto_haber), 0) +
                            (
                                select COALESCE(sum(monto_debe), 0) - COALESCE(sum(monto_haber), 0)
                                FROM contable.vsw_detalle_analitico t
                                WHERE SUBSTRING('{$cuenta->cuenta}' from 1 for {$config_contable[$cuenta->nivel]}) = SUBSTRING(cuenta from 1 for {$config_contable[$cuenta->nivel]})
                                    AND estatus_contab=1
                                    AND activo=1
                                    AND clvejercicio={$ejercicio->id}
                                    AND blnborrado = FALSE
                                    {$movimiento_cierre}
                                    {$where_total_cuenta}
                                    {$where_fecha_ant}
                                LIMIT 1
                            ) as total_monto_actual ",
                'condition' => "SUBSTRING('{$cuenta->cuenta}' from 1 for {$config_contable[$cuenta->nivel]}) = SUBSTRING(cuenta from 1 for {$config_contable[$cuenta->nivel]})
                                AND estatus_contab=1
                                AND activo=1
                                AND clvejercicio={$ejercicio->id}
                                AND blnborrado = FALSE
                                {$movimiento_cierre}
                                {$where_total_cuenta}
                                {$where_fecha}",
            ]);

            $monto_anterior = ($model_total_anterior->total_monto_anterior) ? $model_total_anterior->total_monto_anterior : 0;
            $monto_actual = ($model_total->total_monto_actual) ? $model_total->total_monto_actual : 0;
            $monto_variacion = $monto_actual - $monto_anterior;

            //Verificamos si a la cuenta se le hacen movimientos
            if (DetalleComprobante::model()->exists('id_cuenta='.$cuenta->id) != null) {
                $acum_total_anterior += $monto_anterior;
                $acum_total_actual += $monto_actual;
                $acum_variacion += $monto_variacion;
            }

            //total de los activos
            if (trim($cuenta->cuenta[0]) == '4' && $cuenta->nivel == 1) {
                $acum_ingresos_anterior += $monto_anterior;
                $acum_ingresos_actual += $monto_actual;
                $acum_ingresos_variacion += $monto_variacion;
            }

            //total de los pasivos
            if (trim($cuenta->cuenta[0]) == '5' && $cuenta->nivel == 1) {
                $acum_egresos_anterior += $monto_anterior;
                $acum_egresos_actual += $monto_actual;
                $acum_egresos_variacion += $monto_variacion;
            }

            //Si son los 3 primeros niveles la presentacion debe ser en mayusculas y negrita
            if (in_array($cuenta->nivel, [1, 2, 3])) {
                $clase_cuenta = 'cuenta_alto_nivel';
                $cuenta->cuenta = strtoupper($cuenta->cuenta);
            } else {
                $clase_cuenta = '';
            }

            if ($this->sin_ceros && ($monto_anterior + $monto_actual) == 0) {
                $mostrar = false;
            } else {
                $mostrar = true;
            }

            if ($mostrar) {
                $datos['detalle'][$cuenta->id] = [
                    'clase' => $clase_cuenta,
                    'cuenta_titulo' => $cuenta->titulo_mov == 1,
                    'cuenta' => $cuenta->cuenta,
                    'descripcion' => $cuenta->descripcion,
                    'anterior' => $monto_anterior,
                    'actual' => $monto_actual,
                    'variacion' => $monto_variacion,
                ];
            }

            $total_utilidad_anterior = $acum_ingresos_anterior - $acum_egresos_anterior * -1;
            $total_utilidad_actual = $acum_ingresos_actual - $acum_egresos_actual * -1;
            $total_utilidad_variacion = -$total_utilidad_anterior - $total_utilidad_actual * -1;
        }

        $datos['totales'] = [
            'ingresos' => [
                'anterior' => $acum_ingresos_anterior,
                'actual' => $acum_ingresos_actual,
                'variacion' => $acum_ingresos_variacion,
            ],
            'egresos' => [
                'anterior' => $acum_egresos_anterior,
                'actual' => $acum_egresos_actual,
                'variacion' => $acum_egresos_variacion,
            ],
            'utilidad' => [
                'anterior' => $total_utilidad_anterior,
                'actual' => $total_utilidad_actual,
                'variacion' => $total_utilidad_variacion,
            ],
        ];

        return [$datos, false, ''];
    }
}
