<?php

namespace App\Http\Controllers;

use App\Services\ApiService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;

class AccessRequestController extends Controller
{
    protected ApiService $apiService;

    public function __construct(ApiService $apiService)
    {
        $this->apiService = $apiService;
    }
    /**
     * Display a listing of access requests.
     */
    public function index(Request $request)
    {
        try {
            // Obtener parámetros de filtrado
            $search = $request->get('search');
            $status = $request->get('status');
            $businessType = $request->get('business_type');
            $companySize = $request->get('company_size');
            $page = $request->get('page', 1);
            $perPage = $request->get('per_page', 25);

            // Construir parámetros para la API
            $params = [
                'page' => $page,
                'per_page' => $perPage,
            ];

            if ($search) {
                $params['search'] = $search;
            }

            if ($status) {
                $params['status'] = $status;
            }

            if ($businessType) {
                $params['business_type'] = $businessType;
            }

            if ($companySize) {
                $params['company_size'] = $companySize;
            }

            // Llamar al endpoint de la API usando la función estructural
            $response = $this->apiService->makeApiRequest(
                'GET',
                api_url('access_requests.list'),
                [],
                $params,
                'get_access_requests_list'
            );

            Log::channel('access_requests')->info('Fetched access requests from API', [
                'params' => $params,
                'response' => $response
            ]);

            if ($response['success']) {
                $data = $response['data'];
                $requests = $data['data'] ?? [];
                $pagination = $data['pagination'] ?? [
                    'current_page' => 1,
                    'total_pages' => 1,
                    'total_items' => 0,
                    'per_page' => 25,
                ];
                $stats = $data['stats'] ?? [
                    'total' => 0,
                    'new' => 0,
                    'approved' => 0,
                    'rejected' => 0,
                ];
            } else {
                throw new \Exception($response['message'] ?? 'Error al obtener solicitudes de acceso');
            }

        } catch (\Exception $e) {
            Log::error('Error fetching access requests from API', [
                'error' => $e->getMessage(),
                'trace' => $e->getTraceAsString()
            ]);

            // Datos de ejemplo para desarrollo cuando la API no está disponible
            $requests = [
                [
                    '_id' => '6507f1234567890abcdef001',
                    'company' => 'Panadería San Juan',
                    'name' => 'María González',
                    'email' => 'maria@panaderiasanjuan.com',
                    'phone' => '+54 11 1234-5678',
                    'position' => 'Gerente',
                    'business_type' => 'retail',
                    'company_size' => '1-10',
                    'status' => 'new',
                    'qualification_status' => 'unqualified',
                    'demo_scheduled' => false,
                    'priority' => 2,
                    'lead_score' => 75,
                    'source' => 'siscon-web-access',
                    'message' => 'Somos una panadería tradicional que quiere digitalizarse',
                    'terms_accepted' => true,
                    'privacy_accepted' => true,
                    'ip' => '192.168.1.100',
                    'user_agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
                    'created_at' => '2024-12-20T10:30:00.000Z',
                    'updated_at' => '2024-12-20T10:30:00.000Z',
                ],
                [
                    '_id' => '6507f1234567890abcdef002',
                    'company' => 'Ferretería El Tornillo',
                    'name' => 'Carlos Rodríguez',
                    'email' => 'carlos@ferreterialtornillo.com',
                    'phone' => '+54 11 9876-5432',
                    'position' => 'Propietario',
                    'business_type' => 'retail',
                    'company_size' => '11-50',
                    'status' => 'approved',
                    'qualification_status' => 'qualified',
                    'demo_scheduled' => true,
                    'priority' => 1,
                    'lead_score' => 90,
                    'source' => 'google-ads',
                    'message' => 'Necesitamos modernizar nuestro sistema de inventario',
                    'terms_accepted' => true,
                    'privacy_accepted' => true,
                    'ip' => '192.168.1.101',
                    'user_agent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',
                    'created_at' => '2024-12-19T15:45:00.000Z',
                    'updated_at' => '2024-12-20T09:15:00.000Z',
                ],
                [
                    '_id' => '6507f1234567890abcdef003',
                    'company' => 'Consultoría Tech Solutions',
                    'name' => 'Ana Martínez',
                    'email' => 'ana@techsolutions.com',
                    'phone' => '+54 11 5555-1234',
                    'position' => 'Directora',
                    'business_type' => 'services',
                    'company_size' => '51-200',
                    'status' => 'rejected',
                    'qualification_status' => 'unqualified',
                    'demo_scheduled' => false,
                    'priority' => 4,
                    'lead_score' => 25,
                    'source' => 'linkedin',
                    'message' => 'Estamos evaluando diferentes opciones para nuestros clientes',
                    'terms_accepted' => true,
                    'privacy_accepted' => true,
                    'ip' => '192.168.1.102',
                    'user_agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
                    'created_at' => '2024-12-18T11:20:00.000Z',
                    'updated_at' => '2024-12-19T14:30:00.000Z',
                ],
            ];

            $pagination = [
                'current_page' => 1,
                'total_pages' => 1,
                'total_items' => 3,
                'per_page' => 25,
            ];

            $stats = [
                'total' => 3,
                'new' => 1,
                'approved' => 1,
                'rejected' => 1,
            ];
        }

        return view('access-requests.index', compact(
            'requests',
            'pagination',
            'stats',
            'search',
            'status'
        ));
    }

    /**
     * Display the specified access request.
     */
    public function show($id)
    {
        try {
            // Llamar al endpoint de la API usando la función estructural
            $response = $this->apiService->makeApiRequest(
                'GET',
                api_url('access_requests.show', ['id' => $id]),
                [],
                [],
                'get_access_request_detail'
            );

            if ($response['success']) {
                $request = $response['data'];
            } else {
                return redirect()->route('access-requests.index')
                    ->with('error', 'Solicitud de acceso no encontrada.');
            }

        } catch (\Exception $e) {
            Log::error('Error fetching access request from API', [
                'id' => $id,
                'error' => $e->getMessage()
            ]);

            // Datos de ejemplo para desarrollo cuando la API no está disponible
            $request = [
                '_id' => $id,
                'business_name' => 'Empresa Demo',
                'name' => 'Usuario Demo',
                'email' => 'demo@empresa.com',
                'phone' => '+54 11 1234-5678',
                'cuit' => '20-12345678-9',
                'address' => 'Dirección demo 123',
                'business_type' => 'retail',
                'status' => 'pending',
                'created_at' => now()->toISOString(),
                'requested_plan' => 'PRO',
                'message' => 'Mensaje de ejemplo para la solicitud',
            ];
        }

        return view('access-requests.show', compact('request'));
    }

    /**
     * Approve an access request and create business user.
     */
    public function approve(Request $request, $id)
    {
        try {
            // Usar la función estructural para aprobar la solicitud via API
            $result = $this->apiService->makeApiRequest(
                'POST',
                api_url('access_requests.approve', ['id' => $id]),
                [],
                [],
                'approve_access_request'
            );

            if ($result['success']) {
                Log::info('Solicitud de acceso aprobada exitosamente', [
                    'access_request_id' => $id,
                    'api_response' => $result['data'] ?? null
                ]);

                return redirect()->route('access-requests.index')
                    ->with('success', 'Solicitud aprobada exitosamente. Usuario business creado.');
            } else {
                Log::error('Error al aprobar solicitud de acceso', [
                    'access_request_id' => $id,
                    'error' => $result['error'] ?? $result['message'],
                    'api_response' => $result
                ]);

                return back()->with('error', 'Error al crear el usuario business: ' . ($result['message'] ?? 'Error desconocido'));
            }

        } catch (\Exception $e) {
            Log::error('Error approving access request', [
                'id' => $id,
                'error' => $e->getMessage(),
                'trace' => $e->getTraceAsString()
            ]);

            return back()->with('error', 'Error al procesar la solicitud: ' . $e->getMessage());
        }
    }

    /**
     * Reject an access request.
     */
    public function reject($id)
    {
        try {
            // Usar la función estructural para rechazar la solicitud via API
            $result = $this->apiService->makeApiRequest(
                'POST',
                api_url('access_requests.reject', ['id' => $id]),
                [],
                [],
                'reject_access_request'
            );

            if ($result['success']) {
                return redirect()->route('access-requests.index')
                    ->with('success', 'Solicitud rechazada exitosamente.');
            } else {
                return back()->with('error', 'No se pudo rechazar la solicitud: ' . ($result['message'] ?? 'Error desconocido'));
            }

        } catch (\Exception $e) {
            Log::error('Error rejecting access request', [
                'id' => $id,
                'error' => $e->getMessage()
            ]);

            return back()->with('error', 'Error al rechazar la solicitud: ' . $e->getMessage());
        }
    }

    /**
     * Get statistics for access requests from API.
     */
    private function getStats(): array
    {
        try {
            // Obtener estadísticas usando la función estructural
            $response = $this->apiService->makeApiRequest(
                'GET',
                api_url('access_requests.stats'),
                [],
                [],
                'get_access_request_stats'
            );
            
            if ($response['success']) {
                return $response['data'];
            } else {
                throw new \Exception($response['message'] ?? 'Error al obtener estadísticas');
            }

        } catch (\Exception $e) {
            Log::error('Error getting access request stats from API', ['error' => $e->getMessage()]);
            
            return [
                'total' => 0,
                'pending' => 0,
                'approved' => 0,
                'rejected' => 0,
            ];
        }
    }
}