<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\Validator;
use libphonenumber\PhoneNumberUtil;
use libphonenumber\PhoneNumberFormat;

class ApiController extends Controller
{
    /**
     * Find a user by ID
     *
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function find_user(Request $request)
    {
        // 1. Get the token from the request header (Key should be 'token')
        $token = $request->header('token');

        // 2. Verify the token 
        $SECRET_TOKEN = "8f4d9b2e1a3c7f605d8e2b9c4a1f3b7d";
        if ($token !== $SECRET_TOKEN) {
            return response()->json([
                'status' => 'error',
                'message' => 'Unauthorized: Invalid token'
            ], 401);
        }

        $email = !empty($request->email) ? $request->email : 'null';
        $phone = !empty($request->phone_number) ? $request->phone_number : 'null';

        if ($email == 'null' && $phone == 'null') {
            return response()->json([
                'status' => '0',
                'message' => 'User not found',
            ], 200);
        }

        $formattedPhone = $phone;

        if (!empty($phone)) {
            try {
                $phoneUtil = PhoneNumberUtil::getInstance();
                $numberProto = $phoneUtil->parse($phone, null);
                $countryCode = $numberProto->getCountryCode();
                $nationalNumber = $numberProto->getNationalNumber();
                $formattedPhone = '+' . $countryCode . '-' . $nationalNumber;
            } catch (\Exception $e) {
                $formattedPhone = $phone;
            }
        }

        $site_sort_name = !empty($request->site_sort_name) ? $request->site_sort_name : $this->getSiteSortNameByNumber($request->whatsapp_number);

        // Check if user exists in 'users' table (mapped to Customer model)
        $user = \App\Models\Customer::select('cust_name as name', 'email', 'phone as phone_number', 'web_sort_name', 'lead_source')
            ->when($site_sort_name, function ($q) use ($site_sort_name) {
                return $q->where('web_sort_name', $site_sort_name);
            })
            ->where('phone', '!=', '')
            ->where(function ($query) use ($phone, $formattedPhone) {
                if (!empty($phone)) {
                    $query->where('phone', $phone)
                        ->orWhere('phone', $formattedPhone);
                }
            })
            ->orderBy('id', 'desc')->first();

        if ($user) {
            return response()->json([
                'status' => '1',
                'message' => 'User found successfully',
                'data' => $user
            ], 200);
        }

        // Create new user if not found
        $countryName = '';
        if (isset($countryCode)) {
            $countryName = \Illuminate\Support\Facades\DB::table('country')
                ->where('code', $countryCode)
                ->value('name') ?? '';
        }

        $password = md5('user123');
        $ipAddress = $_SERVER['REMOTE_ADDR'] ?? '';

        $newCustomer = \App\Models\Customer::create([
            'cust_name' => $request->name ?? 'New Customer',
            'password' => $password,
            'email' => ($email !== 'null') ? $email : '',
            'status' => 1,
            'phone' => ($phone !== 'null') ? $formattedPhone : '',
            'country' => $countryName ?: ($request->country ?? ''),
            'customer_password_md5_decode' => 'user123',
            'lead_source' => 'Whatsapp',
            'web_sort_name' => $site_sort_name ?? 'GAH',
            'BD_name' => '',
            'promotion_status' => 0,
            'activate' => 0,
            'storecredit' => 0,
            'image' => '',
            'city' => '',
            'address' => '',
            'link' => '',
            'verify' => 0,
            'view' => 0,
            'rwards_point' => 0,
            'online' => 0,
            'ip_address' => $ipAddress,
            'customer_type' => 0,
            'vendor_view' => 0,
            'vendor_cust_deleted_status' => 0,
            'customer_from' => 0,
            'other_info' => '',
            'auto_mail_send' => 0,
            'payment_getway_token' => '',
            'alternate_phone' => '',
            'alternate_email' => '',
            'email_verify' => 0,
            'phone_verify' => 0,
            'assign_to' => 0,
            'refered_by' => 0,
            'whatsapp_status' => 0,
            'qualification' => '',
            'college' => '',
            'coupon' => '',
            'course' => '',
            'zendesk_ticket_id' => 0,
            'stage' => 'Enquiry',
        ]);

        \App\Models\UserLog::create([
            'user_id' => $newCustomer->id,
            'old_event' => 'Enquiry',
            'event_type' => 'Stage',
            'changed_by' => 1,
            'changed_at' => now()
        ]);

        $user = \App\Models\Customer::select('cust_name as name', 'email', 'phone as phone_number', 'web_sort_name', 'lead_source')
            ->where('id', $newCustomer->id)
            ->first();

        return response()->json([
            'status' => '0',
            'message' => 'User created successfully',
            'data' => $user
        ], 200);
    }

    public function get_order_details(Request $request)
    {
        // Require the static token for authentication
        $token = $request->header('token');
        if ($token !== '1e4e20745582f33c8733ea71f54cf21e') {
            return response()->json([
                'status' => '0',
                'message' => 'Unauthorized'
            ], 401);
        }

        $order_code = $request->input('order_code');

        if (empty($order_code)) {
            return response()->json([
                'status' => '0',
                'message' => 'order_code parameter is required'
            ], 200);
        }

        $order = \App\Models\Order::where(function ($query) use ($order_code) {
            $query->where('order_code', $order_code)
                ->orWhere('id', $order_code);
        })
            ->where('project_status', '!=', 'Not Accepted')
            ->where('internal_pro_status', '!=', 'Cancelled')
            ->first();

        if ($order) {
            if (strtolower($order->internal_pro_status) === 'clarification') {
                $last_chat = \Illuminate\Support\Facades\DB::table('tb_chat')
                    ->where('ordercode', $order->order_code)
                    ->orderBy('id', 'desc')
                    ->first();
                $order->clarification_message = $last_chat ? $last_chat->message : null;
            }

            // Create dashboard links
            $websiteUrl = [
                'GAH' => "https://www.globalassignmenthelp.com/",
                'IAH' => "https://www.instantassignmenthelp.com/",
                'IAH_AU' => "https://www.instantassignmenthelp.com.au/",
                'GAH_AU' => "https://au1.globalassignmenthelp.com.au/",
                'AP' => "https://www.assignmentprime.com/",
                'AD' => "https://www.assignmentdesk.co.uk/"
            ];
            $webName = $order->site_sort_name;
            $id = $order->cust_id;

            $token = '';
            if (!empty($id)) {
                $token = base64_encode(base64_encode($webName . '?$&@' . $id));
            }

            $order->dashboard_link = ($websiteUrl[$webName] ?? '') . 'whatsaap.php?id=' . $token;

            $website_raw_login_links = [
                'GAH' => 'https://www.globalassignmenthelp.com/login',
                'IAH' => 'https://www.instantassignmenthelp.com/login',
                'AD' => 'https://www.assignmentdesk.co.uk/login',
                'AP' => 'https://www.assignmentprime.com/login',
                'IAH_AU' => 'https://www.instantassignmenthelp.com.au/login',
                'GAH_AU' => 'https://www.globalassignmenthelp.com.au/login'
            ];
            $order->login_link = $website_raw_login_links[$order->site_sort_name] ?? null;

            // Deadline Breach Check
            $allowed_statuses = ['tba', 'team allotted', 'in process', 'clarification resolved', 're-do', 'feedback'];
            if (in_array(strtolower($order->internal_pro_status), $allowed_statuses)) {
                $slices = \Illuminate\Support\Facades\DB::table('delivery_slice')
                    ->where('order_id', $order->id)
                    ->get();
                $slice_count = $slices->count();

                if ($slice_count > 1) {
                    $order->deadline_breach_status = 'Multiple Slices';
                } elseif ($slice_count === 1) {
                    $slice = $slices->first();
                    $delivery_date = \Carbon\Carbon::parse($slice->delivery_date);
                    if ($delivery_date->isPast()) {
                        $order->deadline_breach_status = 'Deadline Breached';
                    } else {
                        $order->deadline_breach_status = 'Deadline Upcoming';
                    }
                } else {
                    $datetime = $order->ddate . ' ' . (!empty($order->dtime) ? $order->dtime : '00:00:00');
                    $delivery_date = \Carbon\Carbon::parse($datetime);
                    if ($delivery_date->isPast()) {
                        $order->deadline_breach_status = 'Deadline Breached';
                    } else {
                        $order->deadline_breach_status = 'Deadline Upcoming';
                    }
                }
            }

            if (!empty($order->ddate)) {
                $order->formatted_ddate = \Carbon\Carbon::parse($order->ddate)->format('d-m-Y');
            }

            if ($order->pay_status == 'Partially paid') {
                if (!empty($order->payment_source)) {
                    switch ($order->payment_source) {
                        case 35:
                            $order->bank_details = "Cognus Technology UK Limited\nAcc Number - 00026884\nSORT Code - 77-91-21\nReference - " . $order->order_code;
                            break;
                        case 20:
                            $order->bank_details = "Bank Name- Barclays Bank PLC\nCompany / Payee Name- Optiweb Solutions Ltd\nAccount Number- 43793958\nSort Code - 20 92 63\nSwift Code - BARCGB22\nReference - " . $order->order_code;
                            break;
                        case 27:
                            $order->bank_details = "VERTELIO FINVEST PRIVATE LIMITED\nacc no-004505009256\nIFSC CODE-ICIC0000045\nReference - " . $order->order_code;
                            break;
                        default:
                            $order->bank_details = $order->dashboard_link ?? null;
                            break;
                    }
                }
            }
            $response = [
                'status' => '1',
                'message' => 'Order details found successfully',
                'data' => $order
            ];

            $phone_number = $request->input('phone_number');
            if (!empty($phone_number)) {
                $formattedPhone = $phone_number;
                try {
                    $phoneUtil = PhoneNumberUtil::getInstance();
                    $numberProto = $phoneUtil->parse($phone_number, null);
                    $countryCode = $numberProto->getCountryCode();
                    $nationalNumber = $numberProto->getNationalNumber();
                    $formattedPhone = '+' . $countryCode . '-' . $nationalNumber;
                } catch (\Exception $e) {
                    $formattedPhone = $phone_number;
                }

                $customer = \App\Models\Customer::find($order->cust_id);
                $order_phone = $customer ? $customer->phone : $order->customer_phone;

                if ($order_phone !== $phone_number && $order_phone !== $formattedPhone) {
                    $response['order_not_found'] = 1;
                } else {
                    $response['order_not_found'] = 0;
                }
            }

            return response()->json($response, 200);
        }

        return response()->json([
            'status' => '0',
            'message' => 'Order not found',
        ], 200);
    }

    public function get_client_orders(Request $request)
    {
        // 1. Get the token from the request header (Key should be 'token')
        $token = $request->header('token');

        // 2. Verify the token 
        $SECRET_TOKEN = "8f4d9b2e1a3c7f605d8e2b9c4a1f3b7d";
        if ($token !== $SECRET_TOKEN) {
            return response()->json([
                'status' => 'error',
                'message' => 'Unauthorized: Invalid token'
            ], 401);
        }

        $email = ($request->email === 'null' || empty($request->email)) ? null : trim($request->email);
        $phoneInput = $request->phone_number ?? $request->phone;
        $phone = ($phoneInput === 'null' || empty($phoneInput)) ? null : trim($phoneInput);

        // If both are empty, return error
        if (empty($email) && empty($phone)) {
            return response()->json([
                'status' => '0',
                'message' => 'Email or Phone Number is required',
            ], 200);
        }

        $phoneVariations = [];
        $nationalNumber = null;

        if (!empty($phone)) {
            $phoneVariations[] = $phone;

            // Handle cases where '+' was decoded as space
            if (strpos($phone, ' ') === 0) {
                $phoneWithPlus = '+' . ltrim($phone);
                $phoneVariations[] = $phoneWithPlus;
                $phone = $phoneWithPlus;
            }

            $cleanPhone = preg_replace('/[^\d+]/', '', $phone);
            if (!empty($cleanPhone)) {
                $phoneVariations[] = $cleanPhone;
            }

            try {
                $phoneUtil = PhoneNumberUtil::getInstance();
                $numberProto = $phoneUtil->parse($phone, null);
                $countryCode = $numberProto->getCountryCode();
                $nationalNumber = (string) $numberProto->getNationalNumber();

                $phoneVariations[] = '+' . $countryCode . '-' . $nationalNumber;
                $phoneVariations[] = '+' . $countryCode . $nationalNumber;
                $phoneVariations[] = $nationalNumber;
            } catch (\Exception $e) {
                $digits = preg_replace('/\D/', '', $phone);
                if (strlen($digits) >= 7) {
                    $nationalNumber = substr($digits, -10);
                }
            }

            $phoneVariations = array_values(array_unique(array_filter($phoneVariations)));
        }

        $site_sort_name = !empty($request->site_sort_name) ? $request->site_sort_name : $this->getSiteSortNameByNumber($request->whatsapp_number);

        // Query all matching customer IDs
        $customerQuery = \App\Models\Customer::where(function ($query) use ($phoneVariations, $nationalNumber, $email) {
            $hasCondition = false;
            if (!empty($phoneVariations)) {
                $query->where(function ($q) use ($phoneVariations, $nationalNumber) {
                    $q->whereIn('phone', $phoneVariations);
                    if (!empty($nationalNumber)) {
                        $q->orWhere('phone', 'like', '%' . $nationalNumber . '%');
                    }
                });
                $hasCondition = true;
            }
            if (!empty($email)) {
                if ($hasCondition) {
                    $query->orWhere('email', $email);
                } else {
                    $query->where('email', $email);
                }
            }
        });

        if (!empty($site_sort_name)) {
            $customerQuery->where('web_sort_name', $site_sort_name);
        }

        $customerIds = $customerQuery->pluck('id')->toArray();

        // Query orders linked either via cust_id, customer_phone, or customer_email
        $orderQuery = \App\Models\Order::whereNotNull('order_code')
            ->where('order_code', '!=', '')
            ->where('project_status', '!=', 'Not Accepted')
            ->where('internal_pro_status', '!=', 'Cancelled')
            ->where(function ($query) use ($customerIds, $phoneVariations, $nationalNumber, $email) {
                $hasCondition = false;
                if (!empty($customerIds)) {
                    $query->whereIn('cust_id', $customerIds);
                    $hasCondition = true;
                }
                if (!empty($phoneVariations)) {
                    $method = $hasCondition ? 'orWhere' : 'where';
                    $query->$method(function ($q) use ($phoneVariations, $nationalNumber) {
                        $q->whereIn('customer_phone', $phoneVariations);
                        if (!empty($nationalNumber)) {
                            $q->orWhere('customer_phone', 'like', '%' . $nationalNumber . '%');
                        }
                    });
                    $hasCondition = true;
                }
                if (!empty($email)) {
                    $method = $hasCondition ? 'orWhere' : 'where';
                    $query->$method('customer_email', $email);
                }
            });

        if (!empty($site_sort_name)) {
            $orderQuery->where('site_sort_name', $site_sort_name);
        }

        $orders = $orderQuery->orderBy('id', 'desc')
            ->pluck('order_code')
            ->unique()
            ->filter()
            ->values();

        if ($orders->isNotEmpty()) {
            return response()->json([
                'status' => '1',
                'message' => 'Orders retrieved successfully',
                'data' => $orders->implode("\n")
            ], 200);
        }

        if (empty($customerIds)) {
            return response()->json([
                'status' => '0',
                'message' => 'User not found',
            ], 200);
        }

        return response()->json([
            'status' => '0',
            'message' => 'No orders found',
            'data' => ''
        ], 200);
    }

    public function get_pending_payments_orders(Request $request)
    {
        $token = $request->header('token');
        $SECRET_TOKEN = "8f4d9b2e1a3c7f605d8e2b9c4a1f3b7d";
        if ($token !== $SECRET_TOKEN) {
            return response()->json([
                'status' => 'error',
                'message' => 'Unauthorized: Invalid token'
            ], 401);
        }

        $email = ($request->email === 'null' || empty($request->email)) ? null : trim($request->email);
        $phoneInput = $request->phone_number ?? $request->phone;
        $phone = ($phoneInput === 'null' || empty($phoneInput)) ? null : trim($phoneInput);

        if (empty($email) && empty($phone)) {
            return response()->json([
                'status' => '0',
                'message' => 'Email or Phone Number is required',
            ], 200);
        }

        $phoneVariations = [];
        $nationalNumber = null;

        if (!empty($phone)) {
            $phoneVariations[] = $phone;

            // Handle cases where '+' was decoded as space
            if (strpos($phone, ' ') === 0) {
                $phoneWithPlus = '+' . ltrim($phone);
                $phoneVariations[] = $phoneWithPlus;
                $phone = $phoneWithPlus;
            }

            $cleanPhone = preg_replace('/[^\d+]/', '', $phone);
            if (!empty($cleanPhone)) {
                $phoneVariations[] = $cleanPhone;
            }

            try {
                $phoneUtil = PhoneNumberUtil::getInstance();
                $numberProto = $phoneUtil->parse($phone, null);
                $countryCode = $numberProto->getCountryCode();
                $nationalNumber = (string) $numberProto->getNationalNumber();

                $phoneVariations[] = '+' . $countryCode . '-' . $nationalNumber;
                $phoneVariations[] = '+' . $countryCode . $nationalNumber;
                $phoneVariations[] = $nationalNumber;
            } catch (\Exception $e) {
                $digits = preg_replace('/\D/', '', $phone);
                if (strlen($digits) >= 7) {
                    $nationalNumber = substr($digits, -10);
                }
            }

            $phoneVariations = array_values(array_unique(array_filter($phoneVariations)));
        }

        $site_sort_name = !empty($request->site_sort_name) ? $request->site_sort_name : $this->getSiteSortNameByNumber($request->whatsapp_number);

        // Query all matching customer IDs
        $customerQuery = \App\Models\Customer::where(function ($query) use ($phoneVariations, $nationalNumber, $email) {
            $hasCondition = false;
            if (!empty($phoneVariations)) {
                $query->where(function ($q) use ($phoneVariations, $nationalNumber) {
                    $q->whereIn('phone', $phoneVariations);
                    if (!empty($nationalNumber)) {
                        $q->orWhere('phone', 'like', '%' . $nationalNumber . '%');
                    }
                });
                $hasCondition = true;
            }
            if (!empty($email)) {
                if ($hasCondition) {
                    $query->orWhere('email', $email);
                } else {
                    $query->where('email', $email);
                }
            }
        });

        if (!empty($site_sort_name)) {
            $customerQuery->where('web_sort_name', $site_sort_name);
        }

        $customerIds = $customerQuery->pluck('id')->toArray();

        // 1. First check if user has an order where order_code == '' and pay_status is pending (Lead)
        $leadQuery = \App\Models\Order::where(function ($q) {
            $q->whereNull('order_code')->orWhere('order_code', '');
        })
            ->whereRaw('LOWER(pay_status) = ?', ['pending'])
            ->where('project_status', '!=', 'Not Accepted')
            ->where('internal_pro_status', '!=', 'Cancelled')
            ->where(function ($query) use ($customerIds, $phoneVariations, $nationalNumber, $email) {
                $hasCondition = false;
                if (!empty($customerIds)) {
                    $query->whereIn('cust_id', $customerIds);
                    $hasCondition = true;
                }
                if (!empty($phoneVariations)) {
                    $method = $hasCondition ? 'orWhere' : 'where';
                    $query->$method(function ($q) use ($phoneVariations, $nationalNumber) {
                        $q->whereIn('customer_phone', $phoneVariations);
                        if (!empty($nationalNumber)) {
                            $q->orWhere('customer_phone', 'like', '%' . $nationalNumber . '%');
                        }
                    });
                    $hasCondition = true;
                }
                if (!empty($email)) {
                    $method = $hasCondition ? 'orWhere' : 'where';
                    $query->$method('customer_email', $email);
                }
            });

        if (!empty($site_sort_name)) {
            $leadQuery->where('site_sort_name', $site_sort_name);
        }

        $lead = $leadQuery->orderBy('id', 'desc')->first();

        // If lead found, send the payment link for this order
        if ($lead) {
            $websiteUrl = [
                'GAH' => "https://www.globalassignmenthelp.com/",
                'IAH' => "https://www.instantassignmenthelp.com/",
                'IAH_AU' => "https://www.instantassignmenthelp.com.au/",
                'GAH_AU' => "https://au1.globalassignmenthelp.com.au/",
                'AP' => "https://www.assignmentprime.com/",
                'AD' => "https://www.assignmentdesk.co.uk/"
            ];

            $webName = !empty($lead->site_sort_name) ? $lead->site_sort_name : ($site_sort_name ?? 'GAH');
            $id = !empty($lead->cust_id) ? $lead->cust_id : ($customerIds[0] ?? '');

            $key = base64_encode(
                base64_encode($webName . '?$&@' . $id)
            );

            $paymentLink = ($websiteUrl[$webName] ?? "https://www.globalassignmenthelp.com/")
                . 'whatsaap.php?id=' . $key;

            $lead->payment_link = $paymentLink;

            return response()->json([
                'status' => '1',
                'message' => 'Yes i can see pending order is there you can make the payment through this link-' . $paymentLink,
                'type' => 'leads',
                'data' => [
                    'payment_link' => $paymentLink,
                    'order' => $lead,
                ],
                'payment_link' => $paymentLink,
            ], 200);
        } else {
            // 2. If no lead found, then check where order_code !== '' and pay_status != Complete
            $pendingOrdersQuery = \App\Models\Order::whereNotNull('order_code')
                ->where('order_code', '!=', '')
                ->whereRaw('LOWER(pay_status) != ?', ['complete'])
                ->where('project_status', '!=', 'Not Accepted')
                ->where('internal_pro_status', '!=', 'Cancelled')
                ->where(function ($query) use ($customerIds, $phoneVariations, $nationalNumber, $email) {
                    $hasCondition = false;
                    if (!empty($customerIds)) {
                        $query->whereIn('cust_id', $customerIds);
                        $hasCondition = true;
                    }
                    if (!empty($phoneVariations)) {
                        $method = $hasCondition ? 'orWhere' : 'where';
                        $query->$method(function ($q) use ($phoneVariations, $nationalNumber) {
                            $q->whereIn('customer_phone', $phoneVariations);
                            if (!empty($nationalNumber)) {
                                $q->orWhere('customer_phone', 'like', '%' . $nationalNumber . '%');
                            }
                        });
                        $hasCondition = true;
                    }
                    if (!empty($email)) {
                        $method = $hasCondition ? 'orWhere' : 'where';
                        $query->$method('customer_email', $email);
                    }
                });

            if (!empty($site_sort_name)) {
                $pendingOrdersQuery->where('site_sort_name', $site_sort_name);
            }

            $all_order_codes = (clone $pendingOrdersQuery)
                ->pluck('order_code')
                ->unique()
                ->filter()
                ->implode("\n");

            $order = $pendingOrdersQuery->orderBy('id', 'desc')->first();

            if ($order) {
                // Check payment_source and give payment details
                switch ($order->payment_source) {
                    case 35:
                        $order->bank_details = "Cognus Technology UK Limited\nAcc Number - 00026884\nSORT Code - 77-91-21\nReference - " . $order->order_code;
                        break;
                    case 20:
                        $order->bank_details = "Bank Name- Barclays Bank PLC\nCompany / Payee Name- Optiweb Solutions Ltd\nAccount Number- 43793958\nSort Code - 20 92 63\nSwift Code - BARCGB22\nReference - " . $order->order_code;
                        break;
                    case 27:
                        $order->bank_details = "VERTELIO FINVEST PRIVATE LIMITED\nacc no-004505009256\nIFSC CODE-ICIC0000045\nReference - " . $order->order_code;
                        break;
                    default:
                        $websiteUrl = [
                            'GAH' => "https://www.globalassignmenthelp.com/",
                            'IAH' => "https://www.instantassignmenthelp.com/",
                            'IAH_AU' => "https://www.instantassignmenthelp.com.au/",
                            'GAH_AU' => "https://au1.globalassignmenthelp.com.au/",
                            'AP' => "https://www.assignmentprime.com/",
                            'AD' => "https://www.assignmentdesk.co.uk/"
                        ];
                        $webName = !empty($order->site_sort_name) ? $order->site_sort_name : ($site_sort_name ?? 'GAH');
                        $id = !empty($order->cust_id) ? $order->cust_id : ($customerIds[0] ?? '');
                        $key = base64_encode(base64_encode($webName . '?$&@' . $id));
                        $order->bank_details = ($websiteUrl[$webName] ?? "https://www.globalassignmenthelp.com/") . 'whatsaap.php?id=' . $key;
                        break;
                }

                return response()->json([
                    'status' => '2',
                    'message' => 'I belive you want to make the remaining payment for order
                    order code- ' . $all_order_codes . '
                    pay remaining payment via- '
                        . $order->bank_details,
                    'type' => 'orders',
                    'data' => $order,
                    'order_id' => $order->id,
                    'payment_link' => $order->bank_details,
                    'bank_details' => $order->bank_details,
                    'order_codes' => $all_order_codes
                ], 200);
            }
        }

        return response()->json([
            'status' => '0',
            'message' => 'User not found or no pending records',
            'data' => 'no data found',
            'order_codes' => $all_order_codes ?? ''
        ], 200);
    }

    public function get_pending_payments_leads(Request $request)
    {
        $token = $request->header('token');
        $SECRET_TOKEN = "4a7d1ed414474e4033ac29ccb8653d9b";

        if ($token !== $SECRET_TOKEN) {
            return response()->json([
                'status' => 'error',
                'message' => 'Unauthorized: Invalid token'
            ], 401);
        }

        $email = $request->email === 'null' ? null : $request->email;
        $phone = $request->phone_number === 'null' ? null : $request->phone_number;

        if (empty($email) && empty($phone)) {
            return response()->json([
                'status' => '0',
                'message' => 'Email or Phone Number is required',
            ], 200);
        }

        $formattedPhone = $phone;
        if (!empty($phone)) {
            try {
                $phoneUtil = PhoneNumberUtil::getInstance();
                $numberProto = $phoneUtil->parse($phone, null);
                $countryCode = $numberProto->getCountryCode();
                $nationalNumber = $numberProto->getNationalNumber();
                $formattedPhone = '+' . $countryCode . '-' . $nationalNumber;
            } catch (\Exception $e) {
                $formattedPhone = $phone;
            }
        }

        $site_sort_name = !empty($request->site_sort_name) ? $request->site_sort_name : $this->getSiteSortNameByNumber($request->whatsapp_number);

        $user = \App\Models\Customer::select('id')
            ->when($site_sort_name, function ($q) use ($site_sort_name) {
                return $q->where('web_sort_name', $site_sort_name);
            })
            ->where('phone', '!=', '')
            ->where(function ($query) use ($phone, $formattedPhone) {
                if (!empty($phone)) {
                    $query->where('phone', $phone)
                        ->orWhere('phone', $formattedPhone);
                }
            })
            ->orderBy('id', 'desc')->first();

        if ($user) {

            $lead = \App\Models\Order::where('cust_id', $user->id)
                ->where('order_code', '')
                ->where('project_status', 'Pending')
                ->where('project_status', '!=', 'Not Accepted')
                ->where('internal_pro_status', '!=', 'Cancelled')
                ->when($site_sort_name, function ($q) use ($site_sort_name) {
                    return $q->where('site_sort_name', $site_sort_name);
                })
                ->orderBy('id', 'desc')
                ->first();

            if ($lead) {

                $websiteUrl = [
                    'GAH' => "https://www.globalassignmenthelp.com/",
                    'IAH' => "https://www.instantassignmenthelp.com/",
                    'IAH_AU' => "https://www.instantassignmenthelp.com.au/",
                    'GAH_AU' => "https://au1.globalassignmenthelp.com.au/",
                    'AP' => "https://www.assignmentprime.com/",
                    'AD' => "https://www.assignmentdesk.co.uk/"
                ];

                $webName = $lead->site_sort_name;
                $id = $lead->cust_id;

                $key = base64_encode(
                    base64_encode($webName . '?$&@' . $id)
                );

                $paymentLink = ($websiteUrl[$webName] ?? '')
                    . 'whatsaap.php?id=' . $key;

                return response()->json([
                    'status' => '1',
                    'message' => 'Pending leads found',
                    'type' => 'leads',
                    'data' => [
                        'payment_link' => $paymentLink
                    ]
                ], 200);
            }
        }

        return response()->json([
            'status' => '0',
            'message' => 'User not found or no pending leads',
            'data' => [
                'payment_link' => 0
            ]
        ], 200);
    }

    public function create_order(Request $request)
    {
        $token = $request->header('token');

        if ($token !== '1e4e20745582f33c8733ea71f54cf21e') {
            return response()->json([
                'status' => 'error',
                'message' => 'Unauthorized: Invalid token'
            ], 401);
        }

        $phone = $request->phone_number;
        if (empty($phone)) {
            return response()->json([
                'status' => '0',
                'message' => 'Phone number is required'
            ], 400);
        }



        $formattedPhone = $phone;
        if (!empty($phone)) {
            $phoneObj = \libphonenumber\PhoneNumberUtil::getInstance();
            try {
                $numberProto = $phoneObj->parse($phone, null);
                $countryCode = $numberProto->getCountryCode();
                $nationalNumber = $numberProto->getNationalNumber();
                $formattedPhone = '+' . $countryCode . '-' . $nationalNumber;
            } catch (\libphonenumber\NumberParseException $e) {
                $formattedPhone = $phone;
            }
        }

        $site_sort_name = !empty($request->site_sort_name) ? $request->site_sort_name : $this->getSiteSortNameByNumber($request->whatsapp_number);

        $customerQuery = \App\Models\Customer::where(function ($query) use ($phone, $formattedPhone) {
            $query->where('phone', $phone)
                ->orWhere('phone', $formattedPhone);
        });

        if (!empty($site_sort_name)) {
            $customerQuery->where('web_sort_name', $site_sort_name);
        }

        $customer = $customerQuery->orderBy('id', 'desc')->first();

        if (!$customer) {
            return response()->json([
                'status' => '0',
                'message' => 'Customer not found'
            ], 404);
        }

        $order = new \App\Models\Order();
        $order->cust_id = $customer->id;
        $order->site_sort_name = $customer->web_sort_name ?? 'UNKNOWN';

        $extractedWords = $request->word_count;
        $deadlineInput = $request->deadline;

        $urgency = trim($deadlineInput);
        $ddate = date('Y-m-d H:i:s');

        if (stripos($urgency, 'Hour') !== false) {
            $hours = (int) filter_var($urgency, FILTER_SANITIZE_NUMBER_INT);
            if ($hours == 24) {
                $urgency = '1 Day';
                $ddate = date('Y-m-d H:i:s', strtotime("+1 day"));
            } elseif ($hours > 0) {
                $ddate = date('Y-m-d H:i:s', strtotime("+$hours hours"));
            }
        } elseif (stripos($urgency, 'Day') !== false) {
            $days = (int) filter_var($urgency, FILTER_SANITIZE_NUMBER_INT);
            if ($days > 0) {
                $ddate = date('Y-m-d H:i:s', strtotime("+$days days"));
            }
        } else {
            // fallback if it is a specific date string
            $time = strtotime($urgency);
            $ddate = $time !== false ? date('Y-m-d H:i:s', $time) : date('Y-m-d H:i:s', strtotime('+7 days'));
        }

        $order->topic = $request->input('topic', 'Assignment');

        $doctypeArr = [
            'group_name' => 'Assignment',
            'subject_name' => '',
        ];
        $order->type = json_encode($doctypeArr);
        $order->words = $extractedWords;
        $order->ddate = $ddate;
        $order->urgency = $urgency;

        // Pricing calculation from image table
        $wordsNum = (int) filter_var($extractedWords, FILTER_SANITIZE_NUMBER_INT);
        $gbpPrice = 0;

        if ($wordsNum < 500) {
            $gbpPrice = 7;
        } elseif ($wordsNum < 1000) {
            $gbpPrice = 10;
        } elseif ($wordsNum < 1500) {
            $gbpPrice = 20;
        } elseif ($wordsNum < 2000) {
            $gbpPrice = 25;
        } elseif ($wordsNum < 2500) {
            $gbpPrice = 30;
        } elseif ($wordsNum < 3000) {
            $gbpPrice = 35;
        } elseif ($wordsNum < 3500) {
            $gbpPrice = 40;
        } elseif ($wordsNum < 4000) {
            $gbpPrice = 50;
        } elseif ($wordsNum < 4500) {
            $gbpPrice = 60;
        } elseif ($wordsNum < 5000) {
            $gbpPrice = 70;
        } elseif ($wordsNum < 5500) {
            $gbpPrice = 75;
        } elseif ($wordsNum < 6000) {
            $gbpPrice = 80;
        } elseif ($wordsNum < 6500) {
            $gbpPrice = 90;
        } elseif ($wordsNum < 7000) {
            $gbpPrice = 95;
        } elseif ($wordsNum < 7500) {
            $gbpPrice = 100;
        } elseif ($wordsNum < 8000) {
            $gbpPrice = 105;
        } elseif ($wordsNum < 8500) {
            $gbpPrice = 110;
        } elseif ($wordsNum < 9000) {
            $gbpPrice = 115;
        } elseif ($wordsNum < 9500) {
            $gbpPrice = 120;
        } elseif ($wordsNum < 10000) {
            $gbpPrice = 125;
        } elseif ($wordsNum < 11000) {
            $gbpPrice = 130;
        } elseif ($wordsNum < 12000) {
            $gbpPrice = 135;
        } elseif ($wordsNum < 13000) {
            $gbpPrice = 140;
        } else {
            $gbpPrice = 145; // 13000+
        }

        $usdRateHistory = \Illuminate\Support\Facades\DB::table('currency_values_history')
            ->where('currency', 'USD')
            ->orderBy('date', 'desc')
            ->value('value');
        $usdRate = $usdRateHistory ?? \App\Models\CurrencyValues::where('currency', 'USD')->value('value') ?? 1;

        $gbpRateHistory = \Illuminate\Support\Facades\DB::table('currency_values_history')
            ->where('currency', 'GBP')
            ->orderBy('date', 'desc')
            ->value('value');
        $gbpRate = $gbpRateHistory ?? \App\Models\CurrencyValues::where('currency', 'GBP')->value('value') ?? 1;
        $usdPrice = round($gbpPrice / $gbpRate, 2);

        $order->cost = $usdPrice;
        $order->order_currency = 'GBP';

        // Generate Order Code (Basic Example)
        $order->order_code = '';
        $order->style = '';
        $order->level = '2:2 STANDARD';
        $order->pages = ceil($wordsNum / 250);
        $order->sources = '';
        $order->discription = '';
        $order->file1 = '';
        $order->rdate = date('Y-m-d');
        $order->project_status = 'Pending';
        $order->internal_pro_status = 'TBA';
        $order->pay_status = 'Pending';
        $order->paid = 0;
        $order->payment_source = 0;
        $order->due = $order->cost;
        $order->payment_type = 'US$';
        $order->curr_name = 'USD';
        $order->referral = '';
        $order->order_source = 'Whatsapp';
        $order->view = 1;
        $order->feedback_cust_post = 0;
        $order->feedback_admin_post = 0;
        $order->order_from_cust_panel = 0;
        $order->delivered_files = '';
        $order->vendor_order = 0;
        $order->preview_status = 0;
        $order->customer_name = $customer->cust_name ?? '';
        $rawEmail = !empty($request->email) ? trim($request->email) : (!empty($customer->email) ? trim($customer->email) : '');
        $order->customer_email = $this->isValidEmail($rawEmail) ? $rawEmail : '';
        $order->customer_phone = $customer->phone ?? '';
        $order->customer_country = $customer->country ?? '';
        $order->delivered_files_description = '';
        $order->order_from_app = 0;
        $order->assign_project_team = 0;
        $order->assign_quality_team = 0;
        $order->assign_quality_user = 0;
        $order->turnitin_report_price = '';
        $order->cashback_per = 0;
        $order->dtime = date('H:i:s');
        $order->timezone = '';
        $order->price_without_offer = $order->cost;
        $order->pay_payment_gatway_temp = '0';
        $order->word_unit = $order->pages . ' Pages / ' . $wordsNum . ' Words';
        $order->assign_to = '0';
        $order->moved_from = '0';
        $order->assign_from = '0';
        $order->movetowesite = '0';
        $order->current_value = $gbpRate;
        $order->coupon_info = '';
        $order->wallet_used = '0';
        $order->admin_id = 1;
        $order->created_by = 1;
        try {
            $order->save();

            $order_id = $order->id;
            \App\Models\Order_other::create([
                'tb_order_id' => $order_id,
                'userid' => $order->cust_id,
                'remark' => '',
                'total_redo_count' => '0',
                'feedback_star_mark' => '0',
                'feedback_star_mark_internal' => '0',
                'qualityuser_assign_time' => NULL,
                'project_team_assign_time' => NULL,
                'quality_team_assign_time' => NULL,
                'quality_user_status' => '',
                'internal_description' => '',
                'project_tl_view' => '0',
                'quality_tl_view' => '0',
                'quality_user_view' => '0',
                'chat_post_by_admin' => '0',
                'chat_post_by_user' => '0',
                'tot_feedbak_clint_side' => '0',
                'project_team_notifiaction' => '0',
                'quality_team_notifiaction' => '0',
                'quality_user_notification' => '0',
                'imp_order_for_team' => '0',
                'follow_up_counter' => '0',
                'referral_reward_point_assigned' => '0',
                'followup_status' => '0',
                'order_for_external_writer' => '0',
                'fileready_to_allot_internal' => '0',
                'call_tracking_status' => '0',
                'user_for_call_tracking' => '',
                'call_tracking_teg_user' => '',
                'feedback_priority' => '',
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'status' => '0',
                'message' => 'Failed to save order to database. Some required fields might be missing.',
                'error' => $e->getMessage()
            ], 500);
        }

        // Generate Payment Link
        $websiteUrl = [
            'GAH' => "https://www.globalassignmenthelp.com/",
            'IAH' => "https://www.instantassignmenthelp.com/",
            'IAH_AU' => "https://www.instantassignmenthelp.com.au/",
            'GAH_AU' => "https://au1.globalassignmenthelp.com.au/",
            'AP' => "https://www.assignmentprime.com/",
            'AD' => "https://www.assignmentdesk.co.uk/"
        ];
        $webName = $order->site_sort_name;
        $id = $order->cust_id;
        $key = base64_encode(base64_encode($webName . '?$&@' . $id));
        $payment_link = ($websiteUrl[$webName] ?? '') . 'whatsaap.php?id=' . $key;

        if (!empty($customer->phone) && !empty($webName)) {
            $messageData = [
                'name' => $customer->cust_name ?? 'Customer',
                'siteName' => $webName,
                'order_id' => $order->id,
                'amount' => 'GBP ' . $gbpPrice,
                'words' => $order->words,
                'topic' => $order->topic,
                'ddate' => date('d M, Y', strtotime($order->ddate)),
                'sendTo' => $customer->phone,
                'userId' => $customer->id,
                'img' => '',
                'document' => ''
            ];
            send_whatsapp('quotation', $messageData);
        }

        if (!empty($order->customer_email) && $this->isValidEmail($order->customer_email)) {
            $this->sendQuotationEmail($order, $customer, $payment_link, $gbpPrice);
        }

        return response()->json([
            'status' => '1',
            'message' => 'Order created successfully',
            'order_id' => $order->id,
            'order_code' => $order->order_code,
            'price' => $order->cost,
            'price_in_gbp' => 'GBP ' . $gbpPrice,
            'currency' => $order->order_currency,
            'payment_link' => $payment_link,
            'data' => $order
        ], 200);
    }

    private function isValidEmail(?string $email): bool
    {
        if (empty($email)) {
            return false;
        }
        $email = trim($email);
        return str_contains($email, '@') && str_contains($email, '.') && filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
    }

    private function sendQuotationEmail($order, $customer, $paymentLink, $gbpPrice)
    {
        if (empty($customer->email) || !$this->isValidEmail($customer->email))
            return false;

        $websiteDetails = \App\Models\website::where('sortname', $order->site_sort_name)->first();
        if (!$websiteDetails)
            return false;

        $template = \App\Models\Emailtemplate::where('templates_type_id', 18)
            ->where('website_sortname', $order->site_sort_name)
            ->where('status', 0)
            ->first();

        if (!$template)
            return false;

        $host = str_replace('ssl://', '', $websiteDetails->mail_host);
        $message = $template->message ?? '';
        $subject = $template->subject ?? 'Your Quotation';

        // Basic Replacements
        $message = str_replace("CLIENT_NAME", $customer->cust_name, $message);
        $message = str_replace("CLIENT_EMAIL", $customer->email, $message);
        $message = str_replace("CLIENT_PASSWORD", $customer->customer_password_md5_decode, $message);
        $message = str_replace("WEBSITE_MAIL", $websiteDetails->sendto, $message);
        $message = str_replace("SITE_TITLE_NAME", $websiteDetails->name, $message);

        $siteUrl = rtrim($websiteDetails->url, '/') . '/';
        $message = str_replace("WEB_ADDRESS", $siteUrl, $message);

        // Build Table
        $currSymbol = 'GBP';
        $currCost = $gbpPrice;

        $dataTable = '
        <table style="width:100%; max-width:760px; font-family:Arial, sans-serif; border-collapse: collapse;">
            <tr>
                <td style="border-bottom:1px solid #DBDBDB; padding:10px 0;">
                    <p style="margin: 0 0 3px 0; color: #0B1E46; font-weight:bold; font-size: 15px;">' . $order->id . ' / ' . $order->topic . '</p>
                    <p style="margin: 0; color: #616161; font-size: 13px;">Deadline: ' . $order->urgency . '</p>
                </td>
                <td style="border-bottom:1px solid #DBDBDB; text-align:right; padding:10px 0;">
                    <p style="margin: 0; color: #0B1E46; font-weight:bold; font-size: 15px;">' . $currSymbol . ' ' . $currCost . '</p>
                </td>
            </tr>
        </table>';

        $payBtn = '<div style="text-align:center;"><a href="' . $paymentLink . '" style="background-image: linear-gradient(to right, #0f9dd1 0%, #0c69ad 41%, #0f9dd1 100%); color:#fff; padding:13px 20px; text-decoration:none; border-radius:3px; display:inline-block; font-weight:bold; width: 180px; text-align: center;">Pay Now</a></div>';

        $loginTable = '
        <table cellspacing="0" cellpadding="0" style="width:100%; font-family:Arial; font-size:14px; margin:20px 0;">
            <tr>
                <td style="border: 1px dashed #ccc; padding:8px; background: #f9f9fa; color:#005db7; font-weight: 600; width:35%;">Login Credentials</td>
                <td style="border: 1px dashed #ccc; border-left:0; padding:8px 15px; background: #f9f9fa; width:65%;">
                    <strong>Username</strong>: ' . $customer->email . '<br>
                    <strong>Password</strong>: ' . $customer->customer_password_md5_decode . '
                </td>
            </tr>
        </table>';

        $message = str_replace("TABLE_PAYPAL_DATA", $dataTable, $message);
        $message = str_replace("TABLE_LOGIN_DETAIL", $loginTable, $message);
        $message = str_replace("PAYPALLINK", $payBtn, $message);

        // Remove unreplaced placeholders
        $message = preg_replace('/(ADMIN_PHONE|WHATSUP_NO|ADMIN_PHONE[1-4]|UNIQUE_STRING_ID)/', '', $message);

        // Dynamic Mail Configuration
        $host = str_replace('ssl://', '', $websiteDetails->mail_host);
        \Illuminate\Support\Facades\Config::set('mail.mailers.smtp', [
            'transport' => 'smtp',
            'host' => $host,
            'port' => $websiteDetails->mail_port,
            'encryption' => 'ssl',
            'username' => $websiteDetails->sendto,
            'password' => $websiteDetails->mail_password,
            'timeout' => null,
            'auth_mode' => null,
        ]);
        \Illuminate\Support\Facades\Config::set('mail.from.address', $websiteDetails->sendto);
        \Illuminate\Support\Facades\Config::set('mail.from.name', $websiteDetails->name);

        try {
            \Illuminate\Support\Facades\Mail::html($message, function ($mailMessage) use ($websiteDetails, $subject, $customer) {
                $mailMessage->to($customer->email)
                    ->subject($subject)
                    ->from($websiteDetails->sendto, $websiteDetails->name);
            });
            return true;
        } catch (\Exception $e) {
            \Illuminate\Support\Facades\Log::error('Quotation Email Failed: ' . $e->getMessage());
            return false;
        }
    }

    public function create_order_new_customer(Request $request)
    {
        $token = $request->header('token');

        if ($token !== '1e4e20745582f33c8733ea71f54cf21e') {
            return response()->json([
                'status' => 'error',
                'message' => 'Unauthorized: Invalid token'
            ], 401);
        }

        $phone = $request->phone_number;
        if (empty($phone)) {
            return response()->json([
                'status' => '0',
                'message' => 'Phone number is required'
            ], 400);
        }

        $email = $request->email;
        if (empty($email) || $email === 'null' || (is_string($email) && trim($email) === '')) {
            return response()->json([
                'status' => '0',
                'message' => 'Email is required'
            ], 400);
        }

        $email = trim((string)$email);
        if (!$this->isValidEmail($email)) {
            return response()->json([
                'status' => '0',
                'message' => 'Invalid email format'
            ], 400);
        }

        $request->merge(['email' => $email]);

        $formattedPhone = $phone;
        $countryName = '';
        if (!empty($phone)) {
            $phoneObj = \libphonenumber\PhoneNumberUtil::getInstance();
            try {
                $numberProto = $phoneObj->parse($phone, null);
                $countryCode = $numberProto->getCountryCode();
                $nationalNumber = $numberProto->getNationalNumber();
                $formattedPhone = '+' . $countryCode . '-' . $nationalNumber;

                $countryName = \Illuminate\Support\Facades\DB::table('country')
                    ->where('code', $countryCode)
                    ->value('name') ?? '';
            } catch (\libphonenumber\NumberParseException $e) {
                $formattedPhone = $phone;
            }
        }

        $site_sort_name = !empty($request->site_sort_name) ? $request->site_sort_name : $this->getSiteSortNameByNumber($request->whatsapp_number);

        $customerQuery = \App\Models\Customer::where(function ($query) use ($phone, $formattedPhone) {
            $query->where('phone', $phone)
                ->orWhere('phone', $formattedPhone);
        });

        if (!empty($site_sort_name)) {
            $customerQuery->where('web_sort_name', $site_sort_name);
        }

        $customer = $customerQuery->orderBy('id', 'desc')->first();

        if ($customer) {
            $customer->email = $email;
            $customer->save();
        }

        return $this->create_order($request);
    }

    private function getSiteSortNameByNumber($whatsapp_number)
    {
        if (empty($whatsapp_number)) {
            return null;
        }

        $clean_number = str_replace(' ', '', $whatsapp_number);

        $mapping = [
            '+447400010488' => 'IAH',
            '+16073649807' => 'GAH',
            '+447723580422' => 'IAH_M',
            '+61483933655' => 'AP',
            '+61483982483' => 'GAH_AU',
            '+447575438880' => 'GAH',
            '+447782590068' => 'AD (ZD)',
            '+17753738777' => 'IAH',
            '+61482070482' => 'IAH_AU',
            '+447700173657' => 'GAH_2',
            '+447403375889' => 'AD',
            '+447403300274' => 'AD'
        ];

        return $mapping[$clean_number] ?? null;
    }

    public function get_services(Request $request)
    {
        $token = $request->header('token');
        $SECRET_TOKEN = "8f4d9b2e1a3c7f605d8e2b9c4a1f3b7d";
        if ($token !== $SECRET_TOKEN) {
            return response()->json([
                'status' => 'error',
                'message' => 'Unauthorized: Invalid token'
            ], 401);
        }

        $services = [
            ['id' => '1', 'name' => 'Assignment | Coursework | Term Paper', 'unit_tag' => 'Pages | Words'],
            ['id' => '14', 'name' => 'Case Study | Report Writing', 'unit_tag' => 'Pages | Words'],
            ['id' => '17', 'name' => 'Plagiarism Report', 'unit_tag' => 'Pages | Words'],
            ['id' => '16', 'name' => 'Essay', 'unit_tag' => 'Pages | Words'],
            ['id' => '2', 'name' => 'Dissertation & PHD Thesis', 'unit_tag' => 'Pages | Words'],
            ['id' => '13', 'name' => 'Business Plan', 'unit_tag' => 'Pages | Words'],
            ['id' => '4', 'name' => 'Online Exam | Question based test Papers', 'unit_tag' => 'Que. | Word/Que.'],
            ['id' => '15', 'name' => 'Multiple Choice Questions', 'unit_tag' => 'Que. | Word/Que.'],
            ['id' => '5', 'name' => 'Editing | Proofreading | Paraphrasing', 'unit_tag' => 'Pages | Words'],
            ['id' => '8', 'name' => 'PowerPoint Presentation', 'unit_tag' => 'Slides'],
            ['id' => '9', 'name' => 'Poster', 'unit_tag' => 'Poster'],
            ['id' => '10', 'name' => 'Leaflet', 'unit_tag' => 'Leaflet'],
            ['id' => '6', 'name' => 'Summary Writing', 'unit_tag' => 'Pages | Words'],
            ['id' => '7', 'name' => 'Portfolio', 'unit_tag' => 'Pages | Words'],
            ['id' => '11', 'name' => 'Resume / CV Services', 'unit_tag' => 'Pages | Words'],
        ];

        return response()->json([
            'status' => '1',
            'message' => 'Services retrieved successfully',
            'data' => $services
        ], 200);
    }

    public function update_file(Request $request)
    {
        $token = $request->header('token');
        if ($token !== 'b371190226343542279188e4428a2a72') {
            return response()->json([
                'status' => 'error',
                'message' => 'Unauthorized: Invalid token'
            ], 401);
        }

        $orderId = $request->order_id;
        if (empty($orderId)) {
            return response()->json([
                'status' => '0',
                'message' => 'order_id is required'
            ], 400);
        }

        $order = \App\Models\Order::find($orderId);
        if (!$order) {
            return response()->json([
                'status' => '0',
                'message' => 'Order not found'
            ], 404);
        }

        if (!$request->hasFile('file') || !$request->file('file')->isValid()) {
            return response()->json([
                'status' => '0',
                'message' => 'Valid file is required'
            ], 400);
        }

        $file = $request->file('file');

        // Save to S3
        $originalName = $file->getClientOriginalName();
        $ext = $file->getClientOriginalExtension();
        $name = \Illuminate\Support\Str::limit(pathinfo($originalName, PATHINFO_FILENAME), 10, '') . '_' . rand() . '.' . $ext;

        $webName = $order->site_sort_name ?? 'UNKNOWN';
        $path = "{$webName}/{$name}";
        $s3 = \Illuminate\Support\Facades\Storage::disk('s3');
        $s3->put($path, file_get_contents($file), 'public');

        // Append to existing file1 column
        $existingFiles = trim($order->file1);
        if (!empty($existingFiles)) {
            $order->file1 = $existingFiles . '?|@$' . $name;
        } else {
            $order->file1 = $name;
        }

        $order->save();

        return response()->json([
            'status' => '1',
            'message' => 'File added successfully',
            'order_id' => $order->id,
            'file' => $order->file1,
            'data' => $order
        ], 200);
    }

    public function update_order(Request $request)
    {
        $token = $request->header('token');
        if ($token !== 'b371190226343542279188e4428a2a72') {
            return response()->json([
                'status' => 'error',
                'message' => 'Unauthorized: Invalid token'
            ], 401);
        }

        $orderId = $request->order_id;
        if (empty($orderId)) {
            return response()->json([
                'status' => '0',
                'message' => 'order_id is required'
            ], 400);
        }

        $order = \App\Models\Order::find($orderId);
        if (!$order) {
            return response()->json([
                'status' => '0',
                'message' => 'Order not found'
            ], 404);
        }

        if (!$request->hasFile('file') || !$request->file('file')->isValid()) {
            return response()->json([
                'status' => '0',
                'message' => 'Valid file is required'
            ], 400);
        }

        $file = $request->file('file');

        // Save to S3
        $originalName = $file->getClientOriginalName();
        $ext = $file->getClientOriginalExtension();
        $name = \Illuminate\Support\Str::limit(pathinfo($originalName, PATHINFO_FILENAME), 10, '') . '_' . rand() . '.' . $ext;

        $webName = $order->site_sort_name ?? 'UNKNOWN';
        $path = "{$webName}/{$name}";
        $s3 = \Illuminate\Support\Facades\Storage::disk('s3');
        $s3->put($path, file_get_contents($file), 'public');

        // Update file column
        $order->file1 = $name;

        // Process file for extraction
        $tempFile = $file->getPathname();
        $tempFileWithExt = $tempFile . '.' . $ext;
        copy($tempFile, $tempFileWithExt);

        $extractedData = null;
        $extractionError = null;
        $courseCode = '';

        try {
            $extractionUrl = 'https://drafting.chillyinc.com/api/extract';

            $cfile = new \CURLFile($tempFileWithExt, mime_content_type($tempFileWithExt), $name);

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $extractionUrl);
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, ['file' => $cfile]);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_TIMEOUT, 120);
            curl_setopt($ch, CURLOPT_HTTPHEADER, [
                'Cookie: auth_token=bypass_token',
                'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
                'Accept: application/json, text/plain, */*',
                'Accept-Language: en-US,en;q=0.9',
                'Connection: keep-alive',
                'Referer: https://drafting.chillyinc.com/',
                'Origin: https://drafting.chillyinc.com'
            ]);

            $responseBody = curl_exec($ch);
            $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            curl_close($ch);

            \Illuminate\Support\Facades\Log::info("AutoDrafting Extraction API Status: " . $httpcode);
            \Illuminate\Support\Facades\Log::info("AutoDrafting Extraction API Body: " . $responseBody);

            if ($httpcode >= 200 && $httpcode < 300) {
                $extractedData = json_decode($responseBody, true);
            } else {
                $extractionError = "API Error ($httpcode): " . $responseBody;
                \Illuminate\Support\Facades\Log::error("AutoDrafting Extraction failed: " . $responseBody);
            }

            // Extract course_code / module_code from API result or via local file fallback
            $courseCode = !empty($extractedData['course_code']) ? $extractedData['course_code'] : (!empty($extractedData['module_code']) ? $extractedData['module_code'] : '');
            if (empty($courseCode) && file_exists($tempFileWithExt)) {
                $extractedText = '';
                $fileExt = strtolower($ext);
                if (in_array($fileExt, ['docx', 'doc'])) {
                    $zip = new \ZipArchive();
                    if ($zip->open($tempFileWithExt) === TRUE) {
                        $xml = $zip->getFromName('word/document.xml');
                        $zip->close();
                        if ($xml) {
                            $extractedText = preg_replace('/<[^>]+>/', ' ', $xml);
                        }
                    }
                } elseif ($fileExt === 'pdf') {
                    if (file_exists('/usr/bin/pdftotext')) {
                        $extractedText = @shell_exec('/usr/bin/pdftotext ' . escapeshellarg($tempFileWithExt) . ' - 2>/dev/null');
                    }
                } elseif (in_array($fileExt, ['txt', 'rtf', 'md'])) {
                    $extractedText = @file_get_contents($tempFileWithExt);
                }

                if (!empty($extractedText)) {
                    $codePattern = '/(?:module|course|unit|subject)\s*(?:code|no|number|id)\s*[:\-–]?\s*([A-Za-z0-9]{2,10}(?:[\s\-_][A-Za-z0-9]{2,10})?)|(?:module|course|unit|subject)\s*[:\-–]?\s*([A-Za-z]{1,6}\s*[-_]?\s*\d{2,6}[A-Za-z0-9]*)/i';
                    if (preg_match($codePattern, $extractedText, $matches)) {
                        $courseCode = trim(!empty($matches[1]) ? $matches[1] : $matches[2]);
                    }
                }
            }

            if (!empty($courseCode) && is_array($extractedData)) {
                $extractedData['course_code'] = $courseCode;
            }

            @unlink($tempFileWithExt);
        } catch (\Exception $e) {
            @unlink($tempFileWithExt);
            $extractionError = "Connection Error: " . $e->getMessage();
            \Illuminate\Support\Facades\Log::error("AutoDrafting API Call Error: " . $e->getMessage());
        }

        if ($extractedData && !empty($extractedData['success'])) {
            if (!empty($extractedData['service']) || !empty($extractedData['subject'])) {
                $currentType = json_decode($order->type, true) ?? [];
                $groupName = !empty($extractedData['service']) ? $extractedData['service'] : ($currentType['group_name'] ?? 'Assignment');
                $subjectName = !empty($extractedData['subject']) ? $extractedData['subject'] : ($currentType['subject_name'] ?? '');

                $doctypeArr = [
                    'group_name' => $groupName,
                    'subject_name' => $subjectName,
                ];
                $order->type = json_encode($doctypeArr);
            }

            if (!empty($extractedData['topic'])) {
                $order->topic = $extractedData['topic'];
            }

            if (!empty($extractedData['word_count'])) {
                $extractedWords = $extractedData['word_count'];
                $order->words = $extractedWords;
                $wordsNum = (int) filter_var($extractedWords, FILTER_SANITIZE_NUMBER_INT);
                if ($wordsNum > 0) {
                    $order->pages = ceil($wordsNum / 250);
                    $order->word_unit = $order->pages . ' Pages / ' . $wordsNum . ' Words';
                }
            }

            if (!empty($extractedData['deadline'])) {
                $urgency = $extractedData['deadline'];
                $order->urgency = $urgency;

                if (stripos($urgency, 'Hour') !== false) {
                    $hours = (int) filter_var($urgency, FILTER_SANITIZE_NUMBER_INT);
                    if ($hours == 24) {
                        $order->urgency = '1 Day';
                        $order->ddate = date('Y-m-d H:i:s', strtotime("+1 day"));
                    } elseif ($hours > 0) {
                        $order->ddate = date('Y-m-d H:i:s', strtotime("+$hours hours"));
                    }
                } elseif (stripos($urgency, 'Day') !== false) {
                    $days = (int) filter_var($urgency, FILTER_SANITIZE_NUMBER_INT);
                    if ($days > 0) {
                        $order->ddate = date('Y-m-d H:i:s', strtotime("+$days days"));
                    }
                } else {
                    $time = strtotime($urgency);
                    if ($time !== false) {
                        $order->ddate = date('Y-m-d H:i:s', $time);
                        $diff = $time - time();
                        $days = ceil($diff / (60 * 60 * 24));
                        if ($days <= 0)
                            $days = 1;
                        $order->urgency = $days . ' Days';
                    } else {
                        $order->ddate = date('Y-m-d H:i:s', strtotime('+7 days'));
                        $order->urgency = '7 Days';
                    }
                }
            }

            try {
                $insertData = [
                    'order_id' => $order->id,
                    'order_code' => !empty($order->order_code) ? mb_substr($order->order_code, 0, 10) : '',
                    'topic' => mb_substr($extractedData['topic'] ?? ($order->topic ?? ''), 0, 250),
                    'words' => (isset($wordsNum) && $wordsNum > 0) ? $wordsNum : ((int) filter_var($order->words ?? '', FILTER_SANITIZE_NUMBER_INT) ?: 0),
                    'subject' => mb_substr($extractedData['subject'] ?? ($subjectName ?? ''), 0, 100),
                    'paper_type' => mb_substr($extractedData['service'] ?? ($groupName ?? ''), 0, 100),
                    'university' => mb_substr($extractedData['university_name'] ?? ($extractedData['university'] ?? ''), 0, 100),
                    'college_name' => !empty($extractedData['college']) ? mb_substr($extractedData['college'], 0, 255) : (!empty($extractedData['college_name']) ? mb_substr($extractedData['college_name'], 0, 255) : null),
                    'submission_deadline' => !empty($extractedData['deadline']) ? mb_substr($extractedData['deadline'], 0, 255) : (!empty($order->ddate) ? mb_substr($order->ddate, 0, 255) : null),
                    'website' => mb_substr($order->site_sort_name ?? '', 0, 10),
                    'file' => mb_substr($name ?? ($order->file1 ?? ''), 0, 250),
                    'unit_no' => mb_substr($order->pages ? (string) $order->pages : '', 0, 20),
                    'country' => mb_substr($order->customer_country ?? '', 0, 50),
                    'course_code' => !empty($courseCode) ? mb_substr($courseCode, 0, 50) : (
                        !empty($extractedData['course_code']) ? mb_substr($extractedData['course_code'], 0, 50) : (
                            !empty($extractedData['module_code']) ? mb_substr($extractedData['module_code'], 0, 50) : ''
                        )
                    ),
                    'organisation_selected' => '',
                    'level' => 0,
                    'heading' => '',
                    'permalink' => '',
                    'meta_title' => '',
                    'meta_description' => '',
                    'meta_keywords' => '',
                    'question' => '',
                    'content' => '',
                    'status' => 0,
                    'comment' => '',
                    'ppt_status' => 0,
                    'answer' => '',
                    'answer_chk' => 0,
                    'degree_name' => null,
                    'course_name' => null,
                    'checked_out' => null,
                    'created_by' => 0,
                    'modified_by' => 0,
                    'state' => 0,
                    'ordering' => 0,
                ];

                \Illuminate\Support\Facades\DB::table('temp_samples')->insert($insertData);
                \Illuminate\Support\Facades\Log::info("Inserted new row into temp_samples for order_id: " . $order->id . " (order_code: " . ($order->order_code ?? '') . ")");
            } catch (\Exception $e) {
                \Illuminate\Support\Facades\Log::error("Failed to save extracted data in temp_samples: " . $e->getMessage());
            }
        }

        $order->save();

        return response()->json([
            'status' => '1',
            'message' => 'Order updated successfully',
            'order_id' => $order->id,
            'file' => $order->file1,
            'extracted_data' => $extractedData ?? null,
            'saved_extracted_detail' => !empty($extractedData['success']),
            'extraction_error' => $extractionError,
            //   'data' => $order
        ], 200);
    }

    public function check_email(Request $request)
    {
        $token = $request->header('token');
        $SECRET_TOKEN = "8f4d9b2e1a3c7f605d8e2b9c4a1f3b7d";
        if ($token !== $SECRET_TOKEN) {
            return response()->json([
                'status' => 'error',
                'message' => 'Unauthorized: Invalid token'
            ], 401);
        }

        $email = $request->email;
        if (empty($email) || $email === 'null' || (is_string($email) && trim($email) === '')) {
            return response()->json([
                'status' => '0',
                'is_valid' => false,
                'message' => 'Email is required'
            ], 400);
        }

        $email = trim((string)$email);

        // Format & Syntax Validation
        if (!$this->isValidEmail($email)) {
            return response()->json([
                'status' => '0',
                'is_valid' => false,
                'email' => $email,
                'message' => 'Invalid email format'
            ], 200);
        }

        return response()->json([
            'status' => '1',
            'is_valid' => true,
            'email' => $email,
            'message' => 'Email is valid'
        ], 200);
    }
}
