<?php

namespace App\Http\Controllers;

use App\Model\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;

class EmailWebhookController extends Controller
{
    /**
     * Receive email data from external webhook
     * 
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function store(Request $request)
    {
        // Log incoming request
        $this->logToFile("=== Email Webhook Request Received ===");
        $this->logToFile("Request Data: " . json_encode($request->all()));

        // Validate incoming data - updated for actual payload structure
        $validator = Validator::make($request->all(), [
            'event' => 'nullable|string',
            'timestamp' => 'nullable|string',
            'email.id' => 'nullable|integer',
            'email.message_id' => 'required|string',
            'email.from_email' => 'required|string|max:255',
            'email.from_name' => 'nullable|string|max:255',
            'email.to_email' => 'required|string',
            'email.subject' => 'nullable|string',
            'email.body_preview' => 'nullable|string',
            'email.received_date' => 'required|string',
            'email.has_attachments' => 'required|integer',
        ]);

        if ($validator->fails()) {
            $this->logToFile("❌ Validation Failed: " . json_encode($validator->errors()));
            return response()->json([
                'success' => false,
                'message' => 'Validation failed',
                'errors' => $validator->errors()
            ], 422);
        }

        // Extract data from actual payload structure
        $emailData = $request->input('email');

        // Use to_email as user_email (for reference only)
        $userEmail = $emailData['to_email'];

        // Generate message_id_hash from message_id
        $messageIdHash = hash('sha256', $emailData['message_id']);

        $this->logToFile("✓ Validation passed");
        $this->logToFile("Email to: {$userEmail}");
        $this->logToFile("Generated message_id_hash: {$messageIdHash}");

        try {
            // Always use client_3 database (hardcoded)
            $clientDb = "mysql_3";

            $this->logToFile("Using database: {$clientDb} (client_3 - hardcoded)");

            // Insert email into client database
            $this->logToFile("Inserting email into {$clientDb}.emails");
            $this->logToFile("Email Details - From: {$emailData['from_email']}, Subject: " . ($emailData['subject'] ?? 'N/A'));

            $emailId = DB::connection($clientDb)->table('emails')->insertGetId([
                'message_id' => $emailData['message_id'],
                'message_id_hash' => $messageIdHash,  // Use generated hash
                'from_email' => $emailData['from_email'],
                'from_name' => $emailData['from_name'] ?? null,
                'to_email' => $emailData['to_email'],
                'subject' => $emailData['subject'] ?? null,
                'body_text' => $emailData['body_preview'] ?? null,  // Map body_preview to body_text
                'received_date' => $emailData['received_date'],
                'has_attachments' => $emailData['has_attachments'],
                'created_at' => date('Y-m-d H:i:s'),
            ]);

            $this->logToFile("✓ Email saved successfully - ID: {$emailId} in {$clientDb}");
            $this->logToFile("=== Webhook Request Completed Successfully ===\n");

            return response()->json([
                'success' => true,
                'message' => 'Email saved successfully',
                'database' => $clientDb,
                'email_id' => $emailId
            ], 201);
        } catch (\Illuminate\Database\QueryException $e) {
            // Check if it's a duplicate entry error
            if ($e->getCode() == 23000) {
                $this->logToFile("⊘ Duplicate email detected: {$emailData['message_id']}");
                return response()->json([
                    'success' => false,
                    'message' => 'Duplicate email (already exists)',
                    'error_code' => 'DUPLICATE_ENTRY'
                ], 409);
            }

            $this->logToFile("❌ Database Error: " . $e->getMessage());
            return response()->json([
                'success' => false,
                'message' => 'Database error',
                'error' => $e->getMessage()
            ], 500);
        } catch (\Exception $e) {
            $this->logToFile("❌ Server Error: " . $e->getMessage());
            $this->logToFile("Stack Trace: " . $e->getTraceAsString());

            return response()->json([
                'success' => false,
                'message' => 'Server error',
                'error' => $e->getMessage()
            ], 500);
        }
    }

    /**
     * Log message to file
     * 
     * @param string $message
     * @return void
     */
    private function logToFile($message)
    {
        $logFile = storage_path('app/email_webhook.log');
        $timestamp = date('Y-m-d H:i:s');
        $logMessage = "[{$timestamp}] {$message}\n";
        file_put_contents($logFile, $logMessage, FILE_APPEND);
    }
}
