<?php

class Reembolso
{
    protected $aporte;

    public function __construct($aporte)
    {
        $this->aporte = $aporte;
        Yii::import('application.modules.configuracion.models.*');
    }

    public function getAporte()
    {
        return $this->aporte;
    }

    public function datos()
    {
        return [
            'idproveedor' => $this->getAporte()->id_asociado,
            'id_tipo_orden' => 2,
            'id_tipo_carga' => 3,
            'rif' => $this->getAporte()->cedula,
            'monto_pago' => Yii::app()->format->number($this->getAporte()->totalReembolso()),
            'descripcion' => $this->getAporte()->getDescripcion(),
            'id_concepto' => 3,
            'id_estatus' => 2,
        ];
    }

    public function create()
    {
        if (is_null($this->getAporte()->id_asociado)) {
            return $this->proveedor();
        }

        return $this->asociado();
    }

    public function asociado()
    {
        $datos = $this->validate();
        $asociado = $this->getAporte()->asociado();

        if (is_null($asociado)) {
            throw new Exception("El asociado <strong>{$this->getExtra()->razon_social}</strong>, no esta registrado en la caja.");
        }

        if (! isset($asociado->cuentaPrincipal)) {
            throw new Exception("El asociado <strong>{$asociado->nombreCompleto()}</strong>, no tiene una cuenta de banco registrada.");
        }

        OrdenPago::generar(array_merge($datos, [
            'id_tipo_persona' => $asociado->id_tipo_persona,
            'idbanco' => $asociado->cuentaPrincipal->id,
            'id_concepto' => ConceptosOrdenPago::proceso(6),
        ]), $datos['id_estatus']);

        return true;
    }

    public function proveedor()
    {
        $datos = $this->validate();
        $proveedor = $this->createProveedor();
        $proveedorCuentaBanco = $this->createProveedorCuentaBanco($proveedor);

        OrdenPago::generar(array_merge($datos, [
            'idproveedor' => $proveedor->id,
            'id_tipo_orden' => 1,
            'id_tipo_carga' => 3,
            'rif' => $proveedor->rif,
            'id_tipo_persona' => $proveedor->id_tipo_persona,
            'idbanco' => $proveedorCuentaBanco->id,
            'id_concepto' => ConceptosOrdenPago::proceso(6),
        ]), $datos['id_estatus']);

        return true;
    }

    protected function createProveedor()
    {
        $extra = $this->getExtra();

        return Proveedor::generar([
            'razon_social' => $extra->razon_social,
            'id_tipo_persona' => $extra->id_tipo_persona,
            'rif' => $extra->cedula,
            'correo_electronico' => $extra->correoelectronico,
            'id_cuenta' => ConfBeneficiario::getCuentaContableBeneficiario(),
            'id_tipo_proveedor' => 2,
        ]);
    }

    protected function createProveedorCuentaBanco($proveedor)
    {
        $extra = $this->getExtra();

        return ProveedorCuentaBanco::generar([
            'idproveedor' => $proveedor->id,
            'idbanco' => $extra->id_banco,
            'cuenta_principal' => true,
            'cuenta_bancaria' => $extra->numero_cuenta,
        ]);
    }

    private function validate()
    {
        $datos = $this->datos();

        if (! array_key_exists('id_estatus', $datos)) {
            throw new Exception('La llave <strong>id_estatus</strong> es requerida.');
        }

        return $datos;
    }

    private function getExtra()
    {
        if ($this->getAporte()->extra == null) {
            throw new Exception("Es necesario definir información adicional, para el asociado <strong>{$this->getAporte()->nombreCompleto()}</strong>");
        }

        return json_decode($this->getAporte()->extra);
    }
}
