<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Models\InAccount;
use App\Models\InSetting;
use App\Models\GeneralSetting;
use App\Models\Setting;
use Illuminate\Support\Facades\DB;
use Maatwebsite\Excel\Facades\Excel;
use App\Exports\InstagramAccountsExport;
use App\Models\IncomeHistory;
use App\Models\BalanceLog;
use Illuminate\Database\QueryException;

class InAccountController extends Controller
{
    // ইউজার সাবমিট পেজ দেখানো
public function create()
{
    $setting = InSetting::first();
    $telegramLink = (string) (Setting::query()->where('key', 'instagram_sell_telegram_link')->value('value') ?? '');
    if (trim($telegramLink) === '') {
        $telegramLink = (string) (GeneralSetting::query()->value('telegram_link') ?? '#');
    }
    if (trim($telegramLink) === '') {
        $telegramLink = '#';
    }

    return view('user.in.create', compact('setting', 'telegramLink'));
}
    

public function store(Request $request)
{
    // 1) নরমালাইজ: @ কেটে দিন, লোয়ারকেস, স্পেস ট্রিম
    $cleanUsername = strtolower(ltrim(trim($request->input('username')), '@'));

    // 2) রিকোয়েস্ট merge করে ভ্যালিডেশন চালান
    $request->merge(['username' => $cleanUsername]);

    $request->validate([
        // username: a-z0-9._ only, 1–30 len, এবং টেবিলে ইউনিক
        'username'     => ['required','regex:/^[a-z0-9._]{1,30}$/','unique:in_accounts,username'],
        'password'     => ['required','string'],
        'temp_email'   => ['required','string'],
        'two_fa_code'  => ['required','string'],
    ], [
        'username.unique' => 'এই ইউজারনেম আগে থেকেই সাবমিট করা হয়েছে।',
        'username.regex'  => 'ইউজারনেম শুধু a-z, 0-9, ডট(.) ও আন্ডারস্কোর(_) হতে পারবে (সর্বোচ্চ 30).',
    ]);

    try {
        InAccount::create([
            'user_id'     => Auth::id(),
            'username'    => $cleanUsername,
            'password'    => $request->password,     // চাইলে encrypt() করতে পারেন
            'temp_email'  => $request->temp_email,
            'two_fa_code' => $request->two_fa_code,  // চাইলে encrypt() করতে পারেন
            'status'      => 'pending',
        ]);
    } catch (QueryException $e) {
        // রেস কন্ডিশনে DB unique ভাঙলে সুন্দর মেসেজ দিন
        if ($e->getCode() === '23000') {
            return back()->with('error', 'এই ইউজারনেম আগে থেকেই সাবমিট করা হয়েছে.')->withInput();
        }
        throw $e;
    }

    return back()->with('success', 'Instagram Account submitted successfully!');
}

    // অ্যাডমিনের জন্য লিস্ট
    public function adminView(Request $request)
{
    $status = $request->input('status', 'pending');
    $query  = $request->input('query');

    // অনুমোদিত স্ট্যাটাস
    $allowedStatuses = ['pending', 'checked', 'sold', 'backed'];
    if (!in_array($status, $allowedStatuses, true)) {
        $status = 'pending';
    }

    $base = InAccount::with('user')->where('status', $status);

    // যদি query না থাকে -> স্ট্যাটাস ভিত্তিক সব দেখান (আগের মতো)
    if (!$query) {
        $accounts = $base->orderByDesc('id')->get();
        return view('admin.instagram.accounts', [
            'accounts' => $accounts,
            'status'   => $status,
        ]);
    }

    // ---- EXACT USERNAME SEARCH (multi, no partial) ----
    // কমা/স্পেস/নিউ-লাইন এ আলাদা করা
    $rawUsernames = preg_split('/[\s,]+/', $query, -1, PREG_SPLIT_NO_EMPTY) ?: [];

    // normalize: trim, '@' কেটে দিন, lowercase, unique, ফাঁকা বাদ
    $usernames = [];
    foreach ($rawUsernames as $u) {
        $clean = strtolower(ltrim(trim($u), '@'));
        if ($clean !== '' && preg_match('/^[a-z0-9._]{1,30}$/', $clean)) {
            $usernames[$clean] = true; // unique map
        }
    }
    $usernames = array_keys($usernames);

    // কিছুই valid না হলে -> খালি ফলাফল
    if (count($usernames) === 0) {
        return view('admin.instagram.accounts', [
            'accounts' => collect(),
            'status'   => $status,
        ]);
    }

    // EXACT MATCH ONLY (কোনো LIKE নয়)
    $accounts = $base->whereIn('username', $usernames)
                     ->orderByDesc('id')
                     ->get();

    // কেবল যেগুলো সার্চ করেছেন সেগুলোই আসবে, extra কিছু নয় ✅
    // (whereIn তাই partial match আসবে না)

    return view('admin.instagram.accounts', [
        'accounts' => $accounts,
        'status'   => $status,
    ]);
}


    // স্ট্যাটাস আপডেট

public function updateStatus(Request $request)
{
    $request->validate([
        'ids' => 'required|array',
        'action' => 'required|in:sold,backed,checked'
    ]);

    $accounts = InAccount::whereIn('id', $request->ids)->with('user')->get();
    $setting  = InSetting::first();

    $price       = $setting->per_account_price ?? 0;
    $commissions = $setting->upline_commissions ?? [];

    foreach ($accounts as $account) {

        if ($request->action === 'sold' && $account->status !== 'sold') {

            $user = $account->user;

            if ($user && $price > 0) {

                // ✅ User income
                $user->increment('balance', $price);
                BalanceLog::create(['user_id'=>$user->id,'amount'=>$price]);

                IncomeHistory::create([
                    'user_id'=>$user->id,
                    'source'=>'instagram',
                    'amount'=>$price,
                    'description'=>"Instagram Account বিক্রয় থেকে {$price}৳ ইনকাম",
                ]);

                // ✅ Dynamic Upline Commission
                $ref = $user->upline();

                foreach ($commissions as $level => $amount) {
                    if (!$ref) break;

                    if ($amount > 0) {
                        $ref->increment('balance', $amount);

                        BalanceLog::create([
                            'user_id'=>$ref->id,
                            'amount'=>$amount,
                        ]);

                        IncomeHistory::create([
                            'user_id'=>$ref->id,
                            'source'=>'instagram_bonus',
                            'amount'=>$amount,
                            'description'=>"Instagram Sale থেকে ".($level+1)."য় লেভেল কমিশন {$amount}৳",
                        ]);
                    }

                    $ref = $ref->upline();
                }
            }
        }

        $account->status = $request->action;
        $account->save();
    }

    return back()->with('success','স্ট্যাটাস সফলভাবে আপডেট হয়েছে।');
}
    
    
    // এক্সপোর্ট
    public function export(Request $request)
{
    $status = $request->input('status', 'pending'); // ডিফল্ট স্ট্যাটাস

    $accounts = InAccount::where('status', $status)->with('user')->get();

    $exportData = $accounts->map(function ($acc) {
        return [
            'User' => $acc->user->name ?? 'N/A',
            'Referral' => $acc->user->referral_code ?? 'N/A',
            'Username' => $acc->username,
            'Password' => $acc->password,
            'Temp Email' => $acc->temp_email,
            '2FA' => $acc->two_fa_code,
            'Status' => ucfirst($acc->status),
            'Created' => $acc->created_at->format('Y-m-d H:i:s'),
        ];
    });

    // Excel বানিয়ে রিটার্ন
    return \Excel::download(new \App\Exports\ArrayExport($exportData->toArray()), 'accounts_'.$status.'_'.now()->format('Ymd_His').'.xlsx');
}

public function userHistory(Request $request)
{
    $user = Auth::user();
    $status = $request->input('status', 'all');

    $query = InAccount::where('user_id', $user->id)
        ->when($status !== 'all', function ($q) use ($status) {
            $q->where('status', $status);
        })
        ->latest();

    $accounts = $query->get();

    return view('user.in.history', compact('accounts', 'status'));
}

}
