<?php

use PhpOffice\PhpSpreadsheet\Calculation\MathTrig\Exp;

$correlativoPlanilla = 0;
class Empleado
{
    public $adjuntos = [];
    public $apellidoCasada;
    public $codafp;
    public $codbanco;
    public $coddepartamento;
    public $codempleado;
    public $codempresa;
    public $codestado;
    public $codjefe;
    public $codprofesion;
    public $codproyecto;
    public $codpuesto;
    public $codsucursal;
    public $codtipoplanilla;
    public $conocidoPor;
    public $cotizaAFP;
    public $cotizaisss;
    public $datosLicenciaArma = null;
    public $departamento;
    public $descripcionRecibo;
    public $direccion;
    public $edad;
    public $email;
    public $estadoCivil;
    public $fechaEmisionDUI;
    public $fechaIngreso;
    public $fechaInicioCotizacion;
    public $fechaNacimiento;
    public $fechaVencimientoDUI;
    public $fechaSalida;
    public $genero;
    public $id;
    public $idDepartamento;
    public $idEstadoCivil;
    public $idMunicipio;
    public $idPais;
    public $idTipoDocumento;
    public $idUnidadTrabajo;
    public $isssempleado;
    public $municipio;
    public $nit;
    public $nombreArchivoFoto;
    public $nombreCompleto;
    public $nombreDepartamentoEmpresa;
    public $nombreEstado;
    public $nombreProfesion;
    public $nombreProyecto;
    public $nombreSucursal;
    public $numeroCuenta;
    public $numeroDocumento;
    public $numeroTarjeta;
    public $nupempleado;
    public $nombreDepartamento;
    public $nombrePuesto;
    public $pagoPorTransaccion;
    public $pais;
    public $poseeArma;
    public $primerApellido;
    public $primerNombre;
    public $salario;
    public $salarioLiquido = 0;
    public $segundoApellido;
    public $segundoNombre;
    public $telefonoFijo;
    public $telefonoMovil;
    public $tipoDocumento;
    public $unidadTrabajo;

    public $enviado = false;
    public $generado = false;

    function __construct()
    {
        global $correlativoPlanilla;
        $arrNombreCompleto = [];
        if (!empty($this->primerNombre)) array_push($arrNombreCompleto, trim($this->primerNombre));
        if (!empty($this->segundoNombre)) array_push($arrNombreCompleto, trim($this->segundoNombre));
        if (!empty($this->primerApellido)) array_push($arrNombreCompleto, trim($this->primerApellido));
        if (!empty($this->segundoApellido)) array_push($arrNombreCompleto, trim($this->segundoApellido));
        if (!empty($this->apellidoCasada)) array_push($arrNombreCompleto, trim($this->apellidoCasada));

        $this->nombreCompleto = implode(" ", $arrNombreCompleto);
        $this->nombreCompleto = trim($this->nombreCompleto);

        if (empty($this->email) || trim($this->email) == '0') $this->email = null;

        if ($correlativoPlanilla > 0) {
            !class_exists('DocumentoPago') && require_once __DIR__ . '/documentoPagoModel.php';
            $request = DocumentoPago::verificarPorEmpleadoPlanilla($this->codempleado, $correlativoPlanilla);

            if ($request->status == 200) {
                $this->enviado = $request->envios > 0;
                $this->generado = $request->generaciones > 0;
                $this->salarioLiquido = $request->salarioLiquido;
            }
        }
    }

    public static function obtenerParaDocumentosPago($coddepartamento, $codtipoplanilla, $correlativo): object
    {
        global $correlativoPlanilla;
        $db = obtenerConexion();
        $correlativoPlanilla = intval($correlativo);

        $query = "SELECT * FROM rrhh.view_empleados WHERE coddepartamento = :coddepartamento AND codtipoplanilla = :codtipoplanilla AND codestado IN(1,4,5);";
        $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
        $stmt->bindParam(":coddepartamento", $coddepartamento, PDO::PARAM_INT);
        $stmt->bindParam(":codtipoplanilla", $codtipoplanilla, PDO::PARAM_INT);

        try {
            $stmt->execute();

            $data = $stmt->fetchAll(PDO::FETCH_CLASS, __CLASS__);

            return (object)['status' => 200, 'data' => $data];
        } catch (PDOException $e) {
            return (object)['status' => 500, 'message' => $e->getMessage()];
        }
    }

    public function actualizarEmail(): object
    {
        $db = obtenerConexion();

        $query = "UPDATE [" . DB_NET . "].dbo.gen_empleado SET correoempresarial = :email WHERE codempleado = :codempleado;";
        $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
        $stmt->bindParam(":email", $this->email, PDO::PARAM_STR);
        $stmt->bindParam(":codempleado", $this->codempleado, PDO::PARAM_STR);

        try {
            $stmt->execute();

            return (object)['status' => 200, 'message' => 'success'];
        } catch (PDOException $e) {
            return (object)['status' => 500, 'message' => $e->getMessage()];
        }
    }

    public function actualizarDescripcionRecibo(): object
    {
        $db = obtenerConexion();

        $respuesta = null;

        $query = "EXEC rrhh.sp_actualizarDescripcionReciboEmpleado :codempleado, :descripcionRecibo,:respuesta;";
        $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
        $stmt->bindParam(":codempleado", $this->codempleado, PDO::PARAM_STR);
        $stmt->bindParam(":descripcionRecibo", $this->descripcionRecibo, PDO::PARAM_STR);
        $stmt->bindParam(":respuesta", $respuesta, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT, 300);

        try {
            $stmt->execute();

            return (object)['status' => 200, 'message' => $respuesta];
        } catch (PDOException $e) {
            return (object)['status' => 500, 'message' => $e->getMessage()];
        }
    }

    public static function obtenerPorTipoPlanilla($codempresa, $codtipoplanilla): object
    {
        try {
            if ($codempresa == CODEMPRESA) {
                $db = obtenerConexion();

                $query = "SELECT * FROM rrhh.view_empleados WHERE codtipoplanilla = :codtipoplanilla AND codempresa = :codempresa AND codestado IN(1,4,5);";
                $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
                $stmt->bindParam(":codtipoplanilla", $codtipoplanilla, PDO::PARAM_INT);
                $stmt->bindParam(":codempresa", $codempresa, PDO::PARAM_INT);

                $stmt->execute();

                $data = $stmt->fetchAll(PDO::FETCH_CLASS, __CLASS__);

                return (object)['status' => 200, 'data' => $data];
            } else {
            }
        } catch (PDOException $e) {
            return (object)[
                'status' => 500,
                'message' => $e->getMessage()
            ];
        } catch (Exception $e) {
            return (object)[
                'status' => 500,
                'message' => $e->getMessage()
            ];
        }
    }

    public static function obtenerMultiples($codempleados = []): object
    {
        try {
            $arr = array_map(function ($codempleado) {
                return "'{$codempleado}'";
            }, $codempleados);

            $db = obtenerConexion();

            $string = implode(",", $arr);
            $query = "SELECT * FROM rrhh.view_empleados WHERE codempleado IN({$string}) AND codempresa = :codempresa;";
            $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
            $stmt->bindValue(":codempresa", CODEMPRESA, PDO::PARAM_INT);

            $stmt->execute();

            $data = $stmt->fetchAll(PDO::FETCH_CLASS, __CLASS__);

            return (object)['status' => 200, 'data' => $data];
        } catch (PDOException $e) {
            return (object)[
                'status' => 500,
                'message' => $e->getMessage()
            ];
        } catch (Exception $e) {
            return (object)[
                'status' => 500,
                'message' => $e->getMessage()
            ];
        }
    }

    public static function obtenerPorTipoPlanillaUbicacion($codempresa, $codtipoplanilla, $codsucursal, $codproyecto, $estado = 1): object
    {
        try {
            $db = obtenerConexion();

            $condicionEstado = "";

            if (in_array($estado, [1, 0])) {
                if ($estado === 1) {
                    $condicionEstado = " AND codestado IN(1,4,5)";
                }

                if ($estado === 0) {
                    $condicionEstado = " AND codestado NOT IN(1,4,5)";
                }
            }

            $query = "SELECT * FROM rrhh.view_gestionEmpleados WHERE codempresa = :codempresa AND codtipoplanilla = :codtipoplanilla" . $condicionEstado;
            if ($codsucursal > 0) $query .= " AND codsucursal = :codsucursal";
            if ($codproyecto > 0) $query .= " AND codproyecto = :codproyecto";

            $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
            $stmt->bindParam(":codempresa", $codempresa, PDO::PARAM_INT);
            $stmt->bindParam(":codtipoplanilla", $codtipoplanilla, PDO::PARAM_INT);
            if ($codsucursal > 0) $stmt->bindParam(":codsucursal", $codsucursal, PDO::PARAM_INT);
            if ($codproyecto > 0) $stmt->bindParam(":codproyecto", $codproyecto, PDO::PARAM_INT);

            $stmt->execute();

            $data = $stmt->fetchAll(PDO::FETCH_CLASS, __CLASS__);

            return (object)['status' => 200, 'data' => $data];
        } catch (PDOException $e) {
            return (object)[
                'status' => 500,
                'message' => $e->getMessage()
            ];
        } catch (Exception $e) {
            return (object)[
                'status' => 500,
                'message' => $e->getMessage()
            ];
        }
    }

    public function guardar($db = null): object
    {
        try {
            if (empty($db)) $db = obtenerConexion();
            $respuesta = null;
            $codempleado = null;
            $nombreArchivoFoto = null;
            empty($this->codempleado) && $this->codempleado = '0';

            $extension = pathinfo($this->nombreArchivoFoto, PATHINFO_EXTENSION);

            !empty($this->fechaNacimiento) ? $this->fechaNacimiento = date('Y-m-d', strtotime($this->fechaNacimiento)) : $this->fechaNacimiento = null;
            !empty($this->fechaEmisionDUI) ? $this->fechaEmisionDUI = date('Y-m-d', strtotime($this->fechaEmisionDUI)) : $this->fechaEmisionDUI = null;
            !empty($this->fechaVencimientoDUI) ? $this->fechaVencimientoDUI = date('Y-m-d', strtotime($this->fechaVencimientoDUI)) : $this->fechaVencimientoDUI = null;
            !empty($this->fechaIngreso) ? $this->fechaIngreso = date('Y-m-d', strtotime($this->fechaIngreso)) : $this->fechaIngreso = null;
            !empty($this->fechaInicioCotizacion) ? $this->fechaInicioCotizacion = date('Y-m-d', strtotime($this->fechaInicioCotizacion)) : $this->fechaInicioCotizacion = null;

            $query = "EXEC rrhh.sp_guardarEmpleado :codempleado,:tipoDocumento,:numeroDocumento,:nit,:primerNombre,:segundoNombre,:primerApellido,:segundoApellido,:empresa,:sucursal,:proyecto,:tipoPlanilla,:unidadTrabajo,:genero,:estadoCivil,:apellidoCasada,:conocidoPor,:fechaNacimiento,:pais,:departamento,:municipio,:direccion,:telefonoFijo,:telefonoMovil,:profesion,:fechaEmisionDUI,:fechaVencimientoDUI,:departamentoEmpresa,:puesto,:jefe,:fechaIngreso,:cotizaISSS,:fechaInicioCotizacion,:numeroAfiliacionISSS,:codafp,:nup,:salario,:pagoTransferencia,:banco,:numeroCuenta,:numeroTarjeta,:nombreArchivo,:extensionArchivo,:respuesta,:codempleadoOut,:nombreArchivoFotoOut;";

            $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
            $stmt->bindParam(":codempleado", $this->codempleado, PDO::PARAM_STR);
            $stmt->bindParam(":tipoDocumento", $this->idTipoDocumento, PDO::PARAM_INT);
            $stmt->bindParam(":numeroDocumento", $this->numeroDocumento, PDO::PARAM_STR);
            $stmt->bindParam(":nit", $this->nit, PDO::PARAM_STR);
            $stmt->bindParam(":primerNombre", $this->primerNombre, PDO::PARAM_STR);
            $stmt->bindParam(":segundoNombre", $this->segundoNombre, PDO::PARAM_STR);
            $stmt->bindParam(":primerApellido", $this->primerApellido, PDO::PARAM_STR);
            $stmt->bindParam(":segundoApellido", $this->segundoApellido, PDO::PARAM_STR);
            $stmt->bindValue(":empresa", CODEMPRESA, PDO::PARAM_INT);
            $stmt->bindParam(":sucursal", $this->codsucursal, PDO::PARAM_INT);
            $stmt->bindParam(":proyecto", $this->codproyecto, PDO::PARAM_INT);
            $stmt->bindParam(":tipoPlanilla", $this->codtipoplanilla, PDO::PARAM_INT);
            $stmt->bindParam(":unidadTrabajo", $this->idUnidadTrabajo, PDO::PARAM_INT);
            $stmt->bindParam(":genero", $this->genero, PDO::PARAM_STR);
            $stmt->bindParam(":estadoCivil", $this->idEstadoCivil, PDO::PARAM_INT);
            $stmt->bindParam(":apellidoCasada", $this->apellidoCasada, PDO::PARAM_STR);
            $stmt->bindParam(":conocidoPor", $this->conocidoPor, PDO::PARAM_STR);
            $stmt->bindParam(":fechaNacimiento", $this->fechaNacimiento, PDO::PARAM_STR);
            $stmt->bindParam(":pais", $this->idPais, PDO::PARAM_INT);
            $stmt->bindParam(":departamento", $this->idDepartamento, PDO::PARAM_INT);
            $stmt->bindParam(":municipio", $this->idMunicipio, PDO::PARAM_INT);
            $stmt->bindParam(":direccion", $this->direccion, PDO::PARAM_STR);
            $stmt->bindParam(":telefonoFijo", $this->telefonoFijo, PDO::PARAM_STR);
            $stmt->bindParam(":telefonoMovil", $this->telefonoMovil, PDO::PARAM_STR);
            $stmt->bindParam(":profesion", $this->codprofesion, PDO::PARAM_INT);
            $stmt->bindParam(":fechaEmisionDUI", $this->fechaEmisionDUI, PDO::PARAM_STR);
            $stmt->bindParam(":fechaVencimientoDUI", $this->fechaVencimientoDUI, PDO::PARAM_STR);
            $stmt->bindParam(":departamentoEmpresa", $this->coddepartamento, PDO::PARAM_INT);
            $stmt->bindParam(":puesto", $this->codpuesto, PDO::PARAM_INT);
            $stmt->bindParam(":jefe", $this->codjefe, PDO::PARAM_STR);
            $stmt->bindParam(":fechaIngreso", $this->fechaIngreso, PDO::PARAM_STR);
            $stmt->bindParam(":cotizaISSS", $this->cotizaisss, PDO::PARAM_STR);
            $stmt->bindParam(":fechaInicioCotizacion", $this->fechaInicioCotizacion, PDO::PARAM_STR);
            $stmt->bindParam(":numeroAfiliacionISSS", $this->isssempleado, PDO::PARAM_STR);
            $stmt->bindParam(":codafp", $this->codafp, PDO::PARAM_INT);
            $stmt->bindParam(":nup", $this->nupempleado, PDO::PARAM_STR);
            $stmt->bindParam(":salario", $this->salario, PDO::PARAM_STR);
            $stmt->bindParam(":pagoTransferencia", $this->pagoPorTransaccion, PDO::PARAM_STR);
            $stmt->bindParam(":banco", $this->codbanco, PDO::PARAM_INT);
            $stmt->bindParam(":numeroCuenta", $this->numeroCuenta, PDO::PARAM_STR);
            $stmt->bindParam(":numeroTarjeta", $this->numeroTarjeta, PDO::PARAM_STR);
            $stmt->bindParam(':nombreArchivo', $this->nombreArchivoFoto, PDO::PARAM_STR);
            $stmt->bindParam(":extensionArchivo", $extension, PDO::PARAM_STR);
            $stmt->bindParam(":respuesta", $respuesta, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT, 300);
            $stmt->bindParam(":codempleadoOut", $codempleado, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT, 300);
            $stmt->bindParam(":nombreArchivoFotoOut", $nombreArchivoFoto, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT, 300);

            $stmt->execute();

            $this->codempleado = $codempleado;
            $this->nombreArchivoFoto = $nombreArchivoFoto;

            return (object)[
                'status' => 200,
                'message' => $respuesta,
                'data' => (object)[
                    'codempleado' => $codempleado,
                    'nombreArchivoFoto' => $nombreArchivoFoto
                ]
            ];
        } catch (PDOException $e) {
            return (object)[
                'status' => 500,
                'message' => $e->getMessage()
            ];
        } catch (Exception $e) {
            return (object)[
                'status' => 500,
                'message' => $e->getMessage()
            ];
        }
    }
}
