<?php
require_once __DIR__ . '/../bootstrap.php';

use Gestoreasy\Core\Kernel;
use Gestoreasy\Core\Http\Request;
use Gestoreasy\Core\Auth\Jwt;
use Gestoreasy\Core\Tenant\TenantAdmin;

function assertTrue($cond, $msg){ if(!$cond){ echo "FAIL: {$msg}\n"; exit(1);} }

// Helper: generate valid CNPJ (same rule as Br::isCNPJ)
function generateValidCnpj(): string {
    $base = '';
    for ($i=0; $i<12; $i++) { $base .= (string)random_int(0,9); }
    $calc = function($cnpj, $len){
        $sum = 0; $pos = $len - 7;
        for ($i=0; $i<$len; $i++) {
            $sum += (int)$cnpj[$i] * $pos--;
            if ($pos < 2) $pos = 9;
        }
        $res = $sum % 11; return ($res < 2) ? 0 : 11 - $res;
    };
    $dv1 = $calc($base, 12); $cnpj13 = $base . (string)$dv1; $dv2 = $calc($cnpj13, 13);
    return $cnpj13 . (string)$dv2;
}

// Preparar kernel e token
$kernel = new Kernel();
try { TenantAdmin::runMigrations('default'); } catch (Throwable $e) { /* tolerar */ }

$payload = [ 'sub'=>1, 'email'=>'admin@local', 'name'=>'Admin', 'tenant'=>'default', 'roles'=>['admin'] ];
$token = Jwt::sign($payload);
$headers = [ 'x-tenant-id'=>'default', 'authorization'=>'Bearer ' . $token ];

// 1) Criar dois fornecedores via API (dados completos)
$supplierBodies = [
    [
        'nome' => 'Fornecedor Teste API 1',
        'nome_fantasia' => 'FT API 1',
        'razao_social' => 'Fornecedor Teste API 1 LTDA',
        'tipo' => 'PJ',
        'cnpj' => generateValidCnpj(),
        'ie' => '123456789', 'im' => '987654321',
        'telefone_fixo' => '(11) 2345-6789', 'telefone_celular' => '(11) 99999-8888',
        'referencias' => 'Teste de referências', 'limite_credito' => '25000.00',
        'email' => 'teste1@fornecedores.local', 'contato_nome' => 'Contato 1', 'site_url' => 'https://fornecedores.local/1',
        'observacoes' => 'Observações do fornecedor 1', 'bloqueado' => false, 'inativo' => false,
        'status_motivo' => null,
        'address' => [ 'logradouro'=>'Rua A', 'numero'=>'100', 'complemento'=>'Sala 1', 'bairro'=>'Centro', 'cidade'=>'São Paulo', 'estado'=>'SP', 'cep'=>'01000000' ],
        'billing_address' => [ 'logradouro'=>'Rua B', 'numero'=>'200', 'complemento'=>'', 'bairro'=>'Centro', 'cidade'=>'São Paulo', 'estado'=>'SP', 'cep'=>'01001000' ],
        'shipping_address' => [ 'logradouro'=>'Rua C', 'numero'=>'300', 'complemento'=>'', 'bairro'=>'Jardins', 'cidade'=>'São Paulo', 'estado'=>'SP', 'cep'=>'01415000' ]
    ],
    [
        'nome' => 'Fornecedor Teste API 2',
        'nome_fantasia' => 'FT API 2',
        'razao_social' => 'Fornecedor Teste API 2 LTDA',
        'tipo' => 'PJ',
        'cnpj' => generateValidCnpj(),
        'ie' => '987654321', 'im' => '123123',
        'telefone_fixo' => '(21) 2222-3333', 'telefone_celular' => '(21) 98888-7777',
        'referencias' => 'Referências 2', 'limite_credito' => '45000.00',
        'email' => 'teste2@fornecedores.local', 'contato_nome' => 'Contato 2', 'site_url' => 'https://fornecedores.local/2',
        'observacoes' => 'Observações do fornecedor 2', 'bloqueado' => false, 'inativo' => false,
        'status_motivo' => null,
        'address' => [ 'logradouro'=>'Av. Atlântica', 'numero'=>'500', 'complemento'=>'', 'bairro'=>'Copacabana', 'cidade'=>'Rio de Janeiro', 'estado'=>'RJ', 'cep'=>'22021000' ],
        'billing_address' => [ 'logradouro'=>'Rua das Faturas', 'numero'=>'50', 'complemento'=>'Sala 2', 'bairro'=>'Glória', 'cidade'=>'Rio de Janeiro', 'estado'=>'RJ', 'cep'=>'20211000' ],
        'shipping_address' => [ 'logradouro'=>'Estrada do Porto', 'numero'=>'800', 'complemento'=>'', 'bairro'=>'Caju', 'cidade'=>'Rio de Janeiro', 'estado'=>'RJ', 'cep'=>'20920030' ]
    ]
];

$createdIds = [];
foreach ($supplierBodies as $body) {
    $req = new Request($headers, [], $body, [], 'POST', '/api/fornecedores');
    $resp = $kernel->handle($req);
    assertTrue($resp->status === 200, 'POST /api/fornecedores deve retornar 200');
    $id = (int)($resp->body['id'] ?? 0);
    assertTrue($id > 0, 'Fornecedor criado deve retornar id > 0');
    $createdIds[] = $id;
}

// 2) Listar fornecedores e garantir que retornou itens
$reqList = new Request($headers, ['per_page'=>10], [], [], 'GET', '/api/fornecedores');
$respList = $kernel->handle($reqList);
assertTrue($respList->status === 200, 'GET /api/fornecedores deve retornar 200');
assertTrue(is_array($respList->body['data'] ?? null), 'Resposta deve conter data[]');
assertTrue(($respList->body['total'] ?? 0) >= 2, 'Total deve ser >= 2');

// 3) Buscar detalhe por ID e validar endereços presentes
foreach ($createdIds as $sid) {
    $reqGet = new Request($headers, [], [], [], 'GET', '/api/fornecedores/' . $sid);
    $respGet = $kernel->handle($reqGet);
    assertTrue($respGet->status === 200, 'GET /api/fornecedores/{id} deve retornar 200');
    $row = $respGet->body['data'] ?? null;
    assertTrue(is_array($row), 'Detalhe deve retornar objeto');
    assertTrue(!empty($row['nome']), 'Campo nome deve estar preenchido');
    assertTrue(!empty($row['cnpj']), 'Campo cnpj deve estar preenchido');
    assertTrue(isset($row['address']) || isset($row['billing_address']) || isset($row['shipping_address']), 'Deve possuir pelo menos um endereço');
}

echo "PASS: SuppliersEndpointsTest (criar/listar/detalhar fornecedores).\n";
?>