<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Appointments;
use App\Models\Payments;
use App\Models\AppointmentTag;
use Illuminate\Support\Facades\DB;
use App\Exports\AppointmentPaymentRelationExport;
use Maatwebsite\Excel\Facades\Excel;

class AppointmentPaymentRelationController extends Controller
{
    /**
     * Muestra la vista de relación entre citas y pagos
     * 
     * @param Request $request
     * @return \Illuminate\View\View
     */
    public function index(Request $request)
    {
        // Obtener citas con sus pagos y etiquetas relacionadas
        $query = Appointments::with(['payment.medicalServices', 'tags', 'patient', 'user'])
            ->orderBy('date', 'desc');
            
        // Filtrar por estado de pago si se especifica
        if ($request->filled('payment_status')) {
            if ($request->payment_status === 'with_payment') {
                // Citas con pago (tienen al menos un pago asociado)
                $query->whereHas('payment', function($q) {
                    $q->where('id', '!=', null);
                });
            } elseif ($request->payment_status === 'without_payment') {
                // Citas sin pago (no tienen pagos asociados)
                $query->whereDoesntHave('payment');
            }
        }
        
        // Filtrar por etiqueta si se especifica
        if ($request->filled('tag_id')) {
            $query->whereHas('tags', function($q) use ($request) {
                $q->where('appointment_tags.id', $request->tag_id);
            });
        }
        
        // Filtrar por doctor si se especifica
        if ($request->filled('doctor_id')) {
            $query->where('users_id', $request->doctor_id);
        }
        
        // Filtrar por rango de fechas si se especifica
        if ($request->filled('date_from')) {
            $query->whereDate('date', '>=', $request->date_from);
        }
        
        if ($request->filled('date_to')) {
            $query->whereDate('date', '<=', $request->date_to);
        }
        
        // Filtrar por estado de consulta si se especifica
        if ($request->filled('appointment_status')) {
            $query->where('status', $request->appointment_status);
        }
        
        // Mantener los parámetros de búsqueda en la paginación
        $appointments = $query->paginate(15)->appends($request->except('page'));
        
        // Obtener todas las etiquetas para el filtro
        $tags = AppointmentTag::where('active', true)->orderBy('order')->get();
        
        // Obtener todos los doctores para el filtro
        $doctors = DB::table('users')
            ->join('role_user', 'users.id', '=', 'role_user.user_id')
            ->join('roles', 'role_user.role_id', '=', 'roles.id')
            ->where('roles.name', 'doctor')
            ->select('users.id', 'users.name')
            ->get();
        
        return view('appointments.payment-relation', [
            'appointments' => $appointments,
            'tags' => $tags,
            'doctors' => $doctors,
            'filters' => $request->all()
        ]);
    }
    
    /**
     * Exportar a Excel la relación de citas y pagos con los filtros aplicados
     *
     * @param Request $request
     * @return \Symfony\Component\HttpFoundation\BinaryFileResponse
     */
    public function export(Request $request)
    {
        $filename = 'relacion_citas_pagos_' . date('YmdHis') . '.xlsx';
        
        return Excel::download(new AppointmentPaymentRelationExport($request), $filename);
    }
}
