<?php
namespace App\Helpers;

use Carbon\Carbon;

/**
 * FechaHelper — Equivalente a funciones/fechas.php del sistema original
 *
 * Sistema original usa dos formatos:
 *   - Local (pantalla): d/m/Y  → ej: 15/03/2024
 *   - Base de datos:    Y-m-d  → ej: 2024-03-15
 *
 * Mapeo de funciones originales → Laravel:
 *   implota($fecha)         → FechaHelper::bdToLocal($fecha)    // Y-m-d → d/m/Y
 *   explota($fecha)         → FechaHelper::localToBd($fecha)    // d/m/Y → Y-m-d
 *   implo($fecha)           → FechaHelper::bdToLocalDash($fecha) // Y-m-d → d-m-Y
 *   explo($fecha)           → FechaHelper::dashToBd($fecha)     // d-m-Y → Y-m-d
 *   compara_fechas($f1,$f2) → FechaHelper::diferenciaDias($f1,$f2)
 *   suma_fechas($fecha,$n)  → FechaHelper::sumarDias($fecha,$n)
 *   mesLiteral($mes)        → FechaHelper::mesLiteral($mes)
 */
class FechaHelper
{
    // ── implota() original: Y-m-d → d/m/Y ───────────────────────────────────
    public static function bdToLocal(?string $fecha): string
    {
        if (empty($fecha) || $fecha === '0000-00-00') return '';
        try {
            return Carbon::createFromFormat('Y-m-d', $fecha)->format('d/m/Y');
        } catch (\Exception $e) {
            return '';
        }
    }

    // ── explota() original: d/m/Y → Y-m-d ───────────────────────────────────
    public static function localToBd(?string $fecha): string
    {
        if (empty($fecha)) return '0000-00-00';
        try {
            return Carbon::createFromFormat('d/m/Y', trim($fecha))->format('Y-m-d');
        } catch (\Exception $e) {
            return '0000-00-00';
        }
    }

    // ── implo() original: Y-m-d → d-m-Y ─────────────────────────────────────
    public static function bdToLocalDash(?string $fecha): string
    {
        if (empty($fecha) || $fecha === '0000-00-00') return '';
        try {
            return Carbon::createFromFormat('Y-m-d', $fecha)->format('d-m-Y');
        } catch (\Exception $e) {
            return '';
        }
    }

    // ── explo() original: d-m-Y → Y-m-d ─────────────────────────────────────
    public static function dashToBd(?string $fecha): string
    {
        if (empty($fecha)) return '0000-00-00';
        try {
            return Carbon::createFromFormat('d-m-Y', trim($fecha))->format('Y-m-d');
        } catch (\Exception $e) {
            return '0000-00-00';
        }
    }

    // ── explo2() original: d-m-Y → d/m/Y ────────────────────────────────────
    public static function dashToLocal(?string $fecha): string
    {
        if (empty($fecha)) return '';
        try {
            return Carbon::createFromFormat('d-m-Y', trim($fecha))->format('d/m/Y');
        } catch (\Exception $e) {
            return '';
        }
    }

    // ── compara_fechas() original: diferencia en días entre dos fechas ───────
    // Acepta Y-m-d o d/m/Y automáticamente
    public static function diferenciaDias(string $fecha1, string $fecha2): float
    {
        try {
            $f1 = self::parseFecha($fecha1);
            $f2 = self::parseFecha($fecha2);
            return $f1->diffInDays($f2, false);
        } catch (\Exception $e) {
            return 0;
        }
    }

    // ── suma_fechas() original: sumar días a una fecha ───────────────────────
    public static function sumarDias(string $fecha, int $dias): string
    {
        try {
            return self::parseFecha($fecha)->addDays($dias)->format('d-m-Y');
        } catch (\Exception $e) {
            return '';
        }
    }

    // ── mesLiteral() original ────────────────────────────────────────────────
    public static function mesLiteral(int $mes): string
    {
        $meses = [
            1  => 'ENERO',    2  => 'FEBRERO',   3  => 'MARZO',
            4  => 'ABRIL',    5  => 'MAYO',       6  => 'JUNIO',
            7  => 'JULIO',    8  => 'AGOSTO',     9  => 'SEPTIEMBRE',
            10 => 'OCTUBRE',  11 => 'NOVIEMBRE',  12 => 'DICIEMBRE',
        ];
        return $meses[$mes] ?? '';
    }

    // ── Detecta formato automáticamente y parsea ─────────────────────────────
    public static function parseFecha(string $fecha): Carbon
    {
        $fecha = trim($fecha);
        if (str_contains($fecha, '/')) {
            return Carbon::createFromFormat('d/m/Y', $fecha);
        }
        if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $fecha)) {
            return Carbon::createFromFormat('Y-m-d', $fecha);
        }
        if (str_contains($fecha, '-')) {
            return Carbon::createFromFormat('d-m-Y', $fecha);
        }
        return Carbon::parse($fecha);
    }

    // ── Obtener hoy en formato local ──────────────────────────────────────────
    public static function hoy(): string
    {
        return now('America/La_Paz')->format('d/m/Y');
    }

    // ── Obtener hoy para la BD ────────────────────────────────────────────────
    public static function hoyBd(): string
    {
        return now('America/La_Paz')->format('Y-m-d');
    }
}