<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Contacto;
use App\Models\TipoContacto;
use App\Services\OdooServicesTest;
use App\Services\OdooServices;

class ContactoController extends Controller
{
    protected $odoo;
    protected $odooTest;

    public function __construct(OdooServices $odoo, OdooServicesTest $odooTest)
    {
        $this->odoo = $odoo;
        $this->odooTest = $odooTest;
    }

    /**
     * 🔄 Sincronizar desde Odoo
     */
    public function sincronizarContactosOdoo(Request $request)
    {
        $tipo = $request->get('tipo', 'persona');//persona, empresa O empleado
        $response = $this->odoo->listClientes(500, 0, $tipo);

        if (!$response['success']) {
            return response()->json([
                'success' => false,
                'error'   => $response['error']
            ], 500);
        }

        $tipoModel = TipoContacto::where('nombre', $tipo)->first();

        if (!$tipoModel) {
            return response()->json([
                'success' => false,
                'error' => 'Tipo de contacto no válido'
            ]);
        }

        $odooIds = [];

        foreach ($response['contactos'] as $item) {

            $odooId = $item['id'];
            $odooIds[] = $odooId;

            // limpiar false
            $clean = fn($v) => $v === false ? null : $v;

            Contacto::updateOrCreate(
                ['odoo_id' => $odooId],
                [
                    'tipo_contacto_id' => $tipoModel->id,
                    'nombre'           => $clean($item['complete_name'] ?? null),
                    'email'            => $clean($item['email'] ?? null),
                    'telefono'         => $clean($item['phone'] ?? null),
                    'rut'              => $clean($item['vat'] ?? null),
                    'direccion'        => $clean($item['street'] ?? null),
                    'ciudad'           => $clean($item['city'] ?? null),
                    'pais'             => $item['country_id']['display_name'] ?? null,
                    'odoo_write_date'  => $item['write_date'] ?? null,
                    'raw_odoo'         => $item,
                    'last_sync_at'     => now(),
                    'activo'           => 1
                ]
            );
        }

        // 🔥 DESACTIVAR LOS QUE YA NO EXISTEN
        Contacto::whereNotIn('odoo_id', $odooIds)
            ->where('tipo_contacto_id', $tipoModel->id)
            ->update(['activo' => 0]);

        return response()->json([
            'success' => true,
            'total'   => count($odooIds)
        ]);
    }

    /**
     * 🔎 Consultar
     */
    public function consultar(Request $request)
    {
        $query = Contacto::with('tipo')
            ->where('activo', 1);

        /**
         * 🔎 FILTRO POR TIPO
         */
        if ($request->filled('tipo')) {
            $tipo = $request->tipo;

            $query->whereHas('tipo', function ($q) use ($tipo) {
                $q->where('nombre', $tipo);
            });
        }

        /**
         * 🔎 BUSCADOR
         */
        if ($request->filled('search')) {
            $search = $request->search;

            $query->where(function ($q) use ($search) {
                $q->where('nombre', 'like', "%$search%")
                ->orWhere('email', 'like', "%$search%");
            });
        }

        return response()->json([
            'success' => true,
            'data' => $query->paginate(20)
        ]);
    }

    
    /**
     * 🔄 Sincronizar desde Odoo + envio credenciales
     */
    public function sincronizarContactosOdooTest(Request $request)
    {
        $tipo           = $request->get('tipo', 'persona');//PERSONA, EMPRESA O EMPLEADO
        $ODOO_DATABASE  = $request->get('ODOO_DATABASE', '');
        $ODOO_HOST      = $request->get('ODOO_HOST', '');
        $ODOO_USERNAME  = $request->get('ODOO_USERNAME', '');
        $ODOO_PASSWORD  = $request->get('ODOO_PASSWORD', '');

        $response = $this->odooTest->listClientes(200, 0, $tipo, $ODOO_DATABASE, $ODOO_HOST, $ODOO_USERNAME, $ODOO_PASSWORD);

        if (!$response['success']) {
            return response()->json([
                'success' => false,
                'error'   => $response['error']
            ], 500);
        }

        $tipoModel = TipoContacto::where('nombre', $tipo)->first();

        if (!$tipoModel) {
            return response()->json([
                'success' => false,
                'error' => 'Tipo de contacto no válido'
            ]);
        }

        $odooIds = [];

        foreach ($response['contactos'] as $item) {

            $odooId = $item['id'];
            $odooIds[] = $odooId;

            // limpiar false
            $clean = fn($v) => $v === false ? null : $v;

            Contacto::updateOrCreate(
                ['odoo_id' => $odooId],
                [
                    'tipo_contacto_id' => $tipoModel->id,
                    'nombre'           => $clean($item['complete_name'] ?? null),
                    'email'            => $clean($item['email'] ?? null),
                    'telefono'         => $clean($item['phone'] ?? null),
                    'rut'              => $clean($item['vat'] ?? null),
                    'direccion'        => $clean($item['street'] ?? null),
                    'ciudad'           => $clean($item['city'] ?? null),
                    'pais'             => $item['country_id']['display_name'] ?? null,
                    'odoo_write_date'  => $item['write_date'] ?? null,
                    'raw_odoo'         => $item,
                    'last_sync_at'     => now(),
                    'activo'           => 1
                ]
            );
        }

        // 🔥 DESACTIVAR LOS QUE YA NO EXISTEN
        Contacto::whereNotIn('odoo_id', $odooIds)
            ->where('tipo_contacto_id', $tipoModel->id)
            ->update(['activo' => 0]);

        return response()->json([
            'success' => true,
            'total'   => count($odooIds)
        ]);
    }

}