<?php

class Aprobacion extends Utilidades
{
    protected $ordenPago;
    protected $escenario = 7;
    protected $titulo_proceso = 10;

    public function __construct($ordenPago)
    {
        $this->ordenPago = $ordenPago;
        Yii::import('application.modules.contable.models.*', true);
        Yii::import('application.modules.configuracion.models.*', true);
        Yii::import('application.modules.contable.models.comprobantes.*', true);
    }

    public function contabilizar()
    {
        if (! ParamEscenarios::conectado($this->escenario)) {
            return;
        }

        ////////////////////////////////// COMPROBANTE /////////////////////////////////
        $comprobante = $this->comprobante();

        $this->seguimientoComprobante(
            $comprobante->id,
            $this->ordenPago->id,
            null,
            $this->titulo_proceso
        );
        ////////////////////////// MOVIMIENTOS DEL COMPROBANTE /////////////////////////
        $this->movimientos($comprobante);
    }

    protected function movimientos($comprobante)
    {
        $movimiento = new Movimiento(
            $comprobante,
            $this->ordenPago->getFechaRegistro()
        );

        $monto_aporte = $this->getMontos();

        $movimiento->crear(
            $this->getCuentaConcepto(),
            $monto_aporte['cta_concepto_operacion']
        );

        $movimiento->crear(
            $this->getCuentaProveedor(),
            0,
            $monto_aporte['cta_x_pagar_proveedor']
        );
    }

    protected function getMontos()
    {
        $debe = [
            'cta_concepto_operacion' => $this->ordenPago->monto_pago,
        ];

        $haber = [
            'cta_x_pagar_proveedor' => $this->ordenPago->monto_pago
        ];

        // $this->debug($debe, $haber);

        $this->validate($debe, $haber);

        return array_merge([], $debe, $haber);
    }

    protected function comprobante()
    {
        $this->setProceso($this->ordenPago);

        $comprobante = new Comprobante('crea');
        $comprobante->fecha_comprobante = $this->fechaComprobante();
        $comprobante->descripcion = $this->getDescripcion();
        $comprobante->status = 1;
        $comprobante->nro_documento = $this->ordenPago->rif;

        if (! $comprobante->save()) {
            throw new Exception('Error: <strong>'.array_values($comprobante->getErrors())[0][0].'</strong>');
        }

        return $comprobante;
    }

    protected function getDescripcion()
    {
        return vsprintf('Aprobación órden de pago: %s%s %s', [
            $this->ordenPago->id_tipo_persona,
            $this->ordenPago->rif,
            $this->ordenPago->razon_social
        ]);
    }

    protected function getCuentaConcepto()
    {
        $concepto = $this->ordenPago->concepto;

        if (is_null($concepto->id_cuenta)) {
            throw new Exception("El concepto <strong>{$concepto->descripcion}</strong>, no tiene una cuenta auxiliar definida {$this->configuracionConceptoUrl()}.");
        }

        return $concepto->id_cuenta;
    }

    protected function configuracionConceptoUrl()
    {
        return CHtml::link('Configuración de conceptos', ['/pagos/conceptosOperacion/admin'], ['target' => '_blank']);
    }

    protected function getCuentaProveedor()
    {
        if ($this->ordenPago->tipo === null) {
            return $this->getCuentaProveedorFromTipoOrden();
        } elseif ($this->ordenPago->tipo === true) {
            return $this->getCuentaContableProveedor();
        } elseif ($this->ordenPago->tipo === false) {
            return Parametros::getCuentaContable([
                'clave' => 'cta_x_pagar_asocaido',
                'escenario' => null,
                'tipo_parametro' => null,
                'proceso' => null
            ]);
        }
    }

    private function getCuentaProveedorFromTipoOrden()
    {
        if ($this->ordenPago->id_tipo_orden == 1) {
            return $this->getCuentaContableProveedor();
        } elseif ($this->ordenPago->id_tipo_orden == 2) {
            return Parametros::getCuentaContable([
                'clave' => 'cta_x_pagar_asocaido',
                'escenario' => null,
                'tipo_parametro' => null,
                'proceso' => null
            ]);
        }
    }

    private function getCuentaContableProveedor()
    {
        $proveedor = $this->ordenPago->proveedor;

        if (is_null($proveedor->id_cuenta)) {
            throw new Exception("El proveedor <strong>{$this->ordenPago->razon_social}</strong>, no tiene una cuenta auxiliar definida.");
        }

        return $proveedor->id_cuenta;
    }
}
