<?php

namespace App\Http\Controllers;

use App\Models\Draft;
use App\Models\Company;
use App\Models\Supplier;
use App\Exports\DraftsExport;
use Illuminate\Http\Request;
use Carbon\Carbon;
use TCPDF;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;

class DraftController extends Controller
{
    public function index(Request $request)
    {
        $query = Draft::query();

        // Filtre par mois d'échéance
        if ($request->filled('due_month')) {
            $dueDate = Carbon::createFromFormat('Y-m', $request->input('due_month'));
            $query->whereMonth('due_date', $dueDate->month)
                  ->whereYear('due_date', $dueDate->year);
        }

        // Filtre par banque
        if ($request->filled('bank')) {
            $query->where('bank', $request->input('bank'));
        }

        // Filtre par libellé
        if ($request->filled('label')) {
            $query->where('beneficiary', 'like', '%' . $request->input('label') . '%');
        }

        // Filtre par fournisseur
        if ($request->filled('drawer_name')) {
            $query->where('drawer_name', 'like', '%' . $request->input('drawer_name') . '%');
        }

        // Filtre par statut de paiement
        if ($request->filled('is_paid')) {
            $query->where('is_paid', $request->boolean('is_paid'));
        }

        $drafts = $query->orderBy('due_date')->paginate(10);
        $banks = ['BIAT', 'BNA', 'STB', 'BH', 'ATTIJARI', 'UIB', 'ZITOUNA', 'BTK', 'BTL', 'BTE', 'AMEN BANK'];

        return view('drafts.index', compact('drafts', 'banks'));
    }

    public function create()
    {
        $companies = Company::all();
        $suppliers = Supplier::all();
        return view('drafts.create', compact('companies', 'suppliers'));
    }

    public function store(Request $request)
    {
        $validated = $request->validate([
            'date' => 'required|date',
            'bank' => 'required',
            'drawer_name' => 'required',
            'drawer_address' => 'required',
            'rib' => 'required',
            'beneficiary' => 'required',
            'amount' => 'required|numeric',
            'amount_text' => 'required',
            'place' => 'required',
            'due_date' => 'required|date',
            'invoice_reference' => 'nullable',
            'is_paid' => 'nullable|boolean'
        ]);

        $draft = new Draft($validated);
        
        if ($request->hasFile('file')) {
            $path = $request->file('file')->store('drafts');
            $draft->file_path = $path;
        }

        $draft->save();

        if ($request->input('action') === 'print') {
            return redirect()->route('drafts.print', $draft);
        }

        return redirect()->route('drafts.show', $draft)
            ->with('success', 'Traite créée avec succès')
            ->with('showActions', true);
    }

    public function edit(Draft $draft)
    {
        $companies = Company::all();
        $suppliers = Supplier::all();
        return view('drafts.edit', compact('draft', 'companies', 'suppliers'));
    }

    public function update(Request $request, Draft $draft)
    {
        $validated = $request->validate([
            'date' => 'required|date',
            'bank' => 'required',
            'drawer_name' => 'required',
            'drawer_address' => 'required',
            'rib' => 'required',
            'beneficiary' => 'required',
            'amount' => 'required|numeric',
            'amount_text' => 'required',
            'place' => 'required',
            'due_date' => 'required|date',
            'invoice_reference' => 'nullable'
        ]);

        $draft->update($validated);

        return redirect()->route('drafts.show', $draft)
            ->with('success', 'Traite modifiée avec succès')
            ->with('showActions', true);
    }

    public function show(Draft $draft)
    {
        return view('drafts.show', compact('draft'));
    }

    public function print(Request $request, Draft $draft = null)
    {
        try {
            if ($draft) {
                $data = [
                    'drawer_info' => $draft->drawer_name . "\n" . $draft->drawer_address,
                    'rib' => $draft->rib,
                    'amount' => $draft->amount,
                    'amount_text' => $draft->amount_text,
                    'creation_date' => $draft->date,
                    'creation_place' => $draft->place,
                    'beneficiary' => $draft->beneficiary,
                    'bank' => $draft->bank,
                    'due_date' => $draft->due_date
                ];
            } else {
                $data = $request->validate([
                    'drawer_info' => 'required|string',
                    'rib' => 'required|string|size:20',
                    'amount' => 'required|numeric|min:0',
                    'amount_text' => 'required|string',
                    'creation_date' => 'required|date',
                    'creation_place' => 'required|string',
                    'beneficiary' => 'required|string',
                    'bank' => 'required|string',
                    'due_date' => 'required|date'
                ]);
            }

            Log::info('Données reçues:', $data);

            // Création du PDF en format A4
            $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
            
            // Configuration du PDF
            $pdf->setPrintHeader(false);
            $pdf->setPrintFooter(false);
            $pdf->SetMargins(0, 0, 0);
            $pdf->SetAutoPageBreak(false, 0);
            $pdf->SetCreator('SuiviPaiements');
            $pdf->SetAuthor('SuiviPaiements');
            $pdf->SetTitle('Traite');
            
            // Ajout d'une page A4
            $pdf->AddPage();
            
            // Style par défaut
            $pdf->SetFont('helvetica', '', 10);
            $pdf->setFillColor(255, 255, 255);
            $pdf->SetTextColor(0, 0, 0);
            
            // Dates en haut
            $pdf->SetXY(90, 12);
            $pdf->Cell(40, 5, mb_strtolower($data['creation_place']), 0, 0, 'L', true);
            $pdf->SetXY(90, 17);
            $pdf->Cell(30, 5, Carbon::parse($data['creation_date'])->format('d/m/Y'), 0, 0, 'L', true);
            $pdf->SetXY(55, 17);
            $pdf->Cell(30, 5, Carbon::parse($data['due_date'])->format('d/m/Y'), 0, 0, 'L', true);

            // Dates en milieu
            $pdf->SetXY(8, 58);
            $pdf->Cell(40, 5, mb_strtolower($data['creation_place']), 0, 0, 'L', true);
            $pdf->SetXY(36, 58);
            $pdf->Cell(30, 5, Carbon::parse($data['creation_date'])->format('d/m/Y'), 0, 0, 'L', true);
            $pdf->SetXY(62, 58);
            $pdf->Cell(30, 5, Carbon::parse($data['due_date'])->format('d/m/Y'), 0, 0, 'L', true);
            
            // RIB en haut (en gras)
            $pdf->SetFont('helvetica', 'B', 11);
            $pdf->SetXY(50, 26);
            $pdf->Cell(60, 5, chunk_split($data['rib'], 4, ' '), 0, 0, 'C', true);
            $pdf->SetXY(5, 69);
            $pdf->Cell(60, 5, chunk_split($data['rib'], 4, ' '), 0, 0, 'C', true);
            
            // Montant (en gras)
            $pdf->SetXY(125, 25);
            $pdf->Cell(30, 5, number_format((float)$data['amount'], 3, ',', ' '), 0, 0, 'R', true);
            $pdf->SetXY(125, 40);
            $pdf->Cell(30, 5, number_format((float)$data['amount'], 3, ',', ' '), 0, 0, 'R', true);
            
            // Retour à la police normale
            $pdf->SetFont('helvetica', '', 10);
            
            // Bénéficiaire
            $pdf->SetXY(50, 42);
            $pdf->Cell(80, 5, $data['beneficiary'], 0, 0, 'L', true);
            
            // Montant en lettres
            $pdf->SetXY(7, 50);
            $pdf->MultiCell(130, 5, mb_strtolower($data['amount_text']), 0, 'L', true);
            
            // Banque
            $pdf->SetXY(115, 65);
            $pdf->Cell(30, 20, $data['bank'], 0, 0, 'C', true);
            
            // Nom
            $pdf->SetXY(80, 75);
            $pdf->MultiCell(80, 5, $data['drawer_info'], 0, 'L', true);

            // Génération du PDF
            $pdfContent = $pdf->Output('traite.pdf', 'S');
            
            Log::info('Taille du PDF généré: ' . strlen($pdfContent) . ' octets');

            return response($pdfContent)
                ->header('Content-Type', 'application/pdf')
                ->header('Content-Disposition', 'inline; filename="traite.pdf"')
                ->header('Content-Length', strlen($pdfContent));

        } catch (\Illuminate\Validation\ValidationException $e) {
            Log::error('Erreur de validation:', $e->errors());
            return response()->json([
                'message' => 'Données invalides',
                'details' => $e->errors()
            ], 422);
        } catch (\Exception $e) {
            Log::error('Erreur lors de la génération du PDF: ' . $e->getMessage());
            Log::error($e->getTraceAsString());
            
            return response()->json([
                'message' => 'Erreur lors de la génération du PDF',
                'details' => $e->getMessage()
            ], 500);
        }
    }

    public function export(Request $request)
    {
        $query = Draft::query();

        // Filtre par mois d'échéance
        if ($request->filled('due_month')) {
            $dueDate = Carbon::createFromFormat('Y-m', $request->input('due_month'));
            $query->whereMonth('due_date', $dueDate->month)
                  ->whereYear('due_date', $dueDate->year);
        }

        // Filtre par banque
        if ($request->filled('bank')) {
            $query->where('bank', $request->input('bank'));
        }

        // Filtre par libellé
        if ($request->filled('label')) {
            $query->where('beneficiary', 'like', '%' . $request->input('label') . '%');
        }

        // Filtre par fournisseur
        if ($request->filled('drawer_name')) {
            $query->where('drawer_name', 'like', '%' . $request->input('drawer_name') . '%');
        }

        // Filtre par statut de paiement
        if ($request->filled('is_paid')) {
            $query->where('is_paid', $request->boolean('is_paid'));
        }

        $drafts = $query->orderBy('due_date')->get();
        $export = new DraftsExport($drafts);
        return $export->download('traites.xlsx');
    }

    public function togglePaid(Draft $draft)
    {
        $draft->update(['is_paid' => !$draft->is_paid]);
        return response()->json(['success' => true, 'is_paid' => $draft->is_paid]);
    }

    public function destroy(Draft $draft)
    {
        if ($draft->file_path) {
            Storage::delete($draft->file_path);
        }
        
        $draft->delete();
        
        return redirect()->route('drafts.index')
            ->with('success', 'Traite supprimée avec succès');
    }
}
