<?php
class Indicador_model extends CI_Model {

	function dashboard($fecha = null) {
		$dia = $fecha ? $fecha : date('Y-m-d');

		if ($dia == date('Y-m-d')) {
			$timestamp = strtotime($dia); // hoy: hora actual implícita
		} else {
			$timestamp = strtotime($dia . ' 23:59:59'); // pasado: fin del día
		}

		$data['dia'] = $this->ventas_dia($dia);
		$data['fecha_dia'] = $dia;
		$fechaDiaPasado = date('Y-m-d', strtotime('-1 week', $timestamp));
		$data['fecha_dia_pasado'] = $fechaDiaPasado;
		$data['dia_pasado'] = $this->ventas_dia($fechaDiaPasado);

		$data['crecimiento_dia'] = 0;
		if (!empty($data['dia_pasado'])) {
			$data['crecimiento_dia'] = round(($data['dia'] * 100 / $data['dia_pasado']) - 100, 2);
		}
		elseif ($data['dia'] > 0){
			$data['crecimiento_dia'] = 100;
		}

		$canalesDia = [
			7 => 'Italia 1601',
			8 => 'Los Dominicos',
			12 => 'Drugstore',
			3 => 'Mercado Libre',
			1 => 'Web'
		];
		$data['canales_dia'] = $canalesDia;

		foreach($canalesDia as $k => $nombreCanal) {
			$data['dia_' . $k] = $this->ventas_dia($dia, $k);
			$data['dia_pasado_' . $k] = $this->ventas_dia($fechaDiaPasado, $k);

			$data['crecimiento_dia_'.$k] = 0;
			if (!empty($data['dia_pasado_'.$k])) {
				$data['crecimiento_dia_'.$k] = round(($data['dia_'.$k] * 100 / $data['dia_pasado_'.$k]) - 100, 2);
			}
			elseif ($data['dia_'.$k] > 0) {
				$data['crecimiento_dia_'.$k] = 100;
			}
		}

		// Calculos semanales

		$data['fecha_semana'] = $dia;
		$data['semana'] = $this->ventas_semana($dia);
		$diaSemanaPasada = date('Y-m-d', strtotime('-7 days', $timestamp));
		$data['fecha_semana_pasada'] = $diaSemanaPasada;
		$data['semana_pasada'] = $this->ventas_semana($diaSemanaPasada);

		if (!empty($data['semana_pasada'])) {
			$data['crecimiento_semana'] = round(($data['semana'] * 100 / $data['semana_pasada']) - 100, 2);
		}
		else {
			$data['crecimiento_semana'] = 100;
		}

		$data['fecha_mes'] = $dia;
		$data['mes'] = $this->ventas_mes($dia);		
		// Obtener el mes anterior y el año correspondiente
		$numeroDia = date('d', $timestamp);
		$mesAnterior = date("m", strtotime("first day of last month", $timestamp));
		$anioMesAnterior = date("Y", strtotime("first day of last month", $timestamp));
		$ultimoDiaMesAnterior = cal_days_in_month(CAL_GREGORIAN, $mesAnterior, $anioMesAnterior);
		if ($numeroDia > $ultimoDiaMesAnterior) {
			$numeroDia = $ultimoDiaMesAnterior;
			$ignoraHora = TRUE;
		}
		$diaMesPasado = $anioMesAnterior.'-'.$mesAnterior.'-'.$numeroDia;
		$data['fecha_mes_pasado'] = $diaMesPasado;
		$data['mes_pasado'] = $this->ventas_mes($diaMesPasado);
		if (!empty($data['mes_pasado'])) {
			$data['crecimiento_mes'] = round(($data['mes'] * 100 / $data['mes_pasado']) - 100, 2);
		}
		else {
			$data['crecimiento_mes'] = 100;
		}

		$data['fecha_anio'] = $dia;
		$data['anio'] = $this->ventas_anio($dia);		
		// Obtener el mes anterior y el año correspondiente
		$numeroDia = date('d', $timestamp);
		$numeroMes = date('m', $timestamp);
		$numeroAnio = date('Y', $timestamp);

		// Único caso en que se modifica día de año anterior
		if ($numeroDia == '29' && $numeroMes == '02') {
			$numeroDia = '28';
		}

		$diaAnioPasado = ($numeroAnio - 1) . '-'. $numeroMes . '-'. $numeroDia;

		$data['fecha_anio_pasado'] = $diaAnioPasado;
		$data['anio_pasado'] = $this->ventas_anio($diaAnioPasado);
		if (!empty($data['anio_pasado'])) {
			$data['crecimiento_anio'] = round(($data['anio'] * 100 / $data['anio_pasado']) - 100, 2);
		}
		else {
			$data['crecimiento_anio'] = 100;
		}

		return $data;
	}


	// Entrega las ventas de tienda por cualquier canal del dia hasta la hora actual
	function ventas_dia($dia = '', $idCanal = 0) {
		if (empty($dia)) {
			$dia = date('Y-m-d');
		}
		$hora = date('H:i:s');

		$this->db->select('SUM(total) AS total');
		$this->db->from('ventas v');
		$this->db->join('estados_ventas ev','v.id_estado_venta = ev.id', 'left');
		$this->db->join('canales c','v.id_canal = c.id', 'left');
		$this->db->where('DATE_FORMAT(v.fecha_venta, "%Y-%m-%d") = ', $dia);
		$this->db->where('DATE_FORMAT(v.fecha_venta, "%H:%i:%s") <= ', $hora);
		$this->db->where('ev.vendido', 1);
		$this->db->where('c.mayorista', 0);
		$this->db->where('v.deleted', 0);
		if (!empty($idCanal)) {
			$this->db->where('v.id_canal', $idCanal);
		}
		$diario = $this->db->get()->row_array();

		return $diario['total'] ?? 0;
	}

	// Entrega total de ventas de la semana por cualquier canal no mayorista hasta la hora actual del día indicado de la semana
	function ventas_semana($dia = '') {
		// ve el día actual
		if (empty($dia)) {
			$dia = date('Y-m-d');
		}
		$hora = date('H:i:s');

		if (date('D', strtotime($dia)) == "Mon"){
			$lunes = $dia;
		} else {
			$lunes = date("Y-m-d", strtotime('last Monday', strtotime($dia)));
		}

		$this->db->select('SUM(total) AS total');
		$this->db->from('ventas v');
		$this->db->join('estados_ventas ev','v.id_estado_venta = ev.id', 'left');
		$this->db->join('canales c','v.id_canal = c.id', 'left');
		$this->db->where('v.fecha_venta <= ', $dia.' '.$hora);
		$this->db->where('v.fecha_venta >= ', $lunes.' 00:00:00');
		$this->db->where('ev.vendido', 1);
		$this->db->where('c.mayorista', 0);
		$this->db->where('v.deleted', 0);
		$semanal = $this->db->get()->row_array();

		return $semanal['total'] ?? 0;
	}

	// Entrega total de ventas del mes por cualquier canal no mayorista hasta la hora actual del día indicado del mes
	function ventas_mes($dia = '', $ignoraHora = FALSE) {
		// ve el día actual
		if (empty($dia)) {
			$dia = date('Y-m-d');
		}
		$hora = date('H:i:s');

		$primerDia = date('Y-m'.'-01', strtotime($dia));

		$this->db->select('SUM(total) AS total');
		$this->db->from('ventas v');
		$this->db->join('estados_ventas ev','v.id_estado_venta = ev.id', 'left');
		$this->db->join('canales c','v.id_canal = c.id', 'left');
		
		if (!empty($ignoraHora)) {
			$this->db->where('v.fecha_venta <= ', $dia . ' 23:59:59');
		}
		else {
			$this->db->where('v.fecha_venta <= ', $dia . ' ' . $hora);
		}
		$this->db->where('v.fecha_venta >= ', $primerDia. ' 00:00:00');
		$this->db->where('ev.vendido', 1);
		$this->db->where('c.mayorista', 0);
		$this->db->where('v.deleted', 0);
		$mensual = $this->db->get()->row_array();
		//pr($this->db->last_query());


		return $mensual['total'] ?? 0;
	}

	// Entrega total de ventas del ano por cualquier canal no mayorista hasta la hora actual del día indicado del mes
	function ventas_anio($dia = '', $ignoraHora = FALSE) {
		// ve el día actual
		if (empty($dia)) {
			$dia = date('Y-m-d');
		}
		$hora = date('H-i-s');

		$primerDia = date('Y'.'-01-01', strtotime($dia));

		$this->db->select('SUM(total) AS total');
		$this->db->from('ventas v');
		$this->db->join('estados_ventas ev','v.id_estado_venta = ev.id', 'left');
		$this->db->join('canales c','v.id_canal = c.id', 'left');
		if (!empty($ignoraHora)) {
			$this->db->where('v.fecha_venta <= ', $dia .' 23:59:59');
		}
		else {
			$this->db->where('v.fecha_venta <= ', $dia .' ' . $hora);
		}
		$this->db->where('v.fecha_venta >= ', $primerDia . ' 00:00:00');
		$this->db->where('ev.vendido', 1);
		$this->db->where('c.mayorista', 0);
		$this->db->where('v.deleted', 0);
		$mensual = $this->db->get()->row_array();
		//pr($this->db->last_query());

		return $mensual['total'] ?? 0;
	}

}