<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\PartnerData;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;

class DaPartnerController extends Controller
{
    public function index()
    {
        $partners = PartnerData::where(function($q) {
                $q->whereNull('sub_partner_id')->orWhere('sub_partner_id', '');
            })
            ->with('children')
            ->orderBy('id', 'desc')
            ->paginate(20);
        return view('admin.da-system.partners.index', compact('partners'));
    }

    public function create()
    {
        $partnersList = \App\PartnerData::where(function($q) {
            $q->whereNull('sub_partner_id')->orWhere('sub_partner_id', '');
        })->orderBy('name')->pluck('name', 'id');
        return view('admin.da-system.partners.create', compact('partnersList'));
    }

    public function store(Request $request)
    {
        $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'nullable|email|max:255',
            'mobile' => 'nullable|string|max:20',
            'pan' => 'nullable|string|max:20',
            'gstn' => 'nullable|string|max:20',
        ]);

        $bankInputs = $request->input('banks', []);
        $firstBank = reset($bankInputs);
        
        $partnerData = $request->only((new PartnerData())->getFillable());
        if ($firstBank) {
            $partnerData['bank_name'] = $firstBank['bank_name'] ?? null;
            $partnerData['bank_account_holder_name'] = $firstBank['bank_account_holder_name'] ?? null;
            $partnerData['bank_account_number'] = $firstBank['bank_account_number'] ?? null;
            $partnerData['bank_identifier_code'] = $firstBank['bank_identifier_code'] ?? null;
        }

        $partner = PartnerData::create($partnerData);

        if ($request->has('banks')) {
            foreach ($request->input('banks') as $bankData) {
                if (!empty($bankData['bank_name']) || !empty($bankData['bank_account_number'])) {
                    $partner->banks()->create($bankData);
                }
            }
        }

        Session::flash('success', 'Partner created successfully.');
        return redirect('/admin/da-system/partners');
    }

    public function edit($id)
    {
        $partner = PartnerData::with('banks')->findOrFail($id);
        $partnersList = PartnerData::where('id', '!=', $id)
            ->where(function($query) {
                $query->whereNull('sub_partner_id')->orWhere('sub_partner_id', '');
            })
            ->orderBy('name')->pluck('name', 'id');

        $documents = DB::table('da_partner_documents')
            ->where('partner_id', $partner->id)
            ->orderBy('id', 'desc')
            ->get();

        return view('admin.da-system.partners.create', compact('partner', 'partnersList', 'documents'));
    }

    public function update(Request $request, $id)
    {
        $partner = PartnerData::findOrFail($id);

        $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'nullable|email|max:255',
            'mobile' => 'nullable|string|max:20',
            'pan' => 'nullable|string|max:20',
            'gstn' => 'nullable|string|max:20',
        ]);

        $bankInputs = $request->input('banks', []);
        $firstBank = reset($bankInputs);

        $partnerData = $request->only((new PartnerData())->getFillable());
        if ($firstBank) {
            $partnerData['bank_name'] = $firstBank['bank_name'] ?? null;
            $partnerData['bank_account_holder_name'] = $firstBank['bank_account_holder_name'] ?? null;
            $partnerData['bank_account_number'] = $firstBank['bank_account_number'] ?? null;
            $partnerData['bank_identifier_code'] = $firstBank['bank_identifier_code'] ?? null;
        } else {
            $partnerData['bank_name'] = null;
            $partnerData['bank_account_holder_name'] = null;
            $partnerData['bank_account_number'] = null;
            $partnerData['bank_identifier_code'] = null;
        }

        $partner->update($partnerData);

        if ($request->has('banks')) {
            $submittedBankIds = collect($request->input('banks'))->pluck('id')->filter()->toArray();
            $partner->banks()->whereNotIn('id', $submittedBankIds)->delete();

            foreach ($request->input('banks') as $bankData) {
                if (!empty($bankData['bank_name']) || !empty($bankData['bank_account_number'])) {
                    if (isset($bankData['id']) && !empty($bankData['id'])) {
                        $partner->banks()->where('id', $bankData['id'])->update([
                            'bank_name' => $bankData['bank_name'] ?? null,
                            'bank_account_holder_name' => $bankData['bank_account_holder_name'] ?? null,
                            'bank_account_number' => $bankData['bank_account_number'] ?? null,
                            'bank_identifier_code' => $bankData['bank_identifier_code'] ?? null,
                        ]);
                    } else {
                        $partner->banks()->create($bankData);
                    }
                }
            }
        } else {
            $partner->banks()->delete();
        }

        Session::flash('success', 'Partner updated successfully.');
        return redirect('/admin/da-system/partners');
    }

    public function destroy($id)
    {
        PartnerData::findOrFail($id)->delete();
        Session::flash('success', 'Partner deleted successfully.');
        return redirect('/admin/da-system/partners');
    }

    public function viewDocument($id)
    {
        $document = DB::table('da_partner_documents')->where('id', $id)->first();

        if (!$document) {
            abort(404, 'Document record not found');
        }

        $filePath = $document->file_path;

        if (!Storage::disk('s3')->exists($filePath)) {
            abort(404, 'File not found on S3');
        }

        $fileContent = Storage::disk('s3')->get($filePath);
        $fileName = !empty($document->file_name) ? $document->file_name : basename($filePath);
        $ext = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));

        $mimeTypes = [
            'pdf'  => 'application/pdf',
            'png'  => 'image/png',
            'jpg'  => 'image/jpeg',
            'jpeg' => 'image/jpeg',
            'gif'  => 'image/gif',
            'webp' => 'image/webp',
            'csv'  => 'text/csv',
            'txt'  => 'text/plain',
            'doc'  => 'application/msword',
            'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'xls'  => 'application/vnd.ms-excel',
            'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
        ];

        $mimeType = isset($mimeTypes[$ext]) ? $mimeTypes[$ext] : 'application/octet-stream';

        return response($fileContent, 200, [
            'Content-Type'        => $mimeType,
            'Content-Disposition' => 'inline; filename="' . $fileName . '"',
        ]);
    }
}
