<?php

namespace Database\Seeders;

use App\Models\City;
use App\Models\Country;
use App\Models\State;
use GuzzleHttp\Client;
use Illuminate\Database\Seeder;

class BrazilCitiesSeeder extends Seeder
{
    public function run()
    {

        try {
            $brasil = Country::firstOrNew(
                [
                    'name' => 'Brasil',
                    'code' => 'BR',
                ]
            );
            $brasil->save();

            $client_estados = new Client;
            $url_estados = 'https://servicodados.ibge.gov.br/api/v1/localidades/estados';
            $response_estados = $client_estados->request('GET', $url_estados);

            $estados = json_decode($response_estados->getBody());

            foreach ($estados as $estado) {
                echo "Criando estado {$estado->nome}\n";

                $new_estado = State::firstOrNew(
                    [
                        'name'       => $estado->nome,
                        'code'       => $estado->sigla,
                        'country_id' => $brasil->id,
                    ]
                );
                $new_estado->save();

                $client_cidades = new Client;
                $url_cidades = "https://servicodados.ibge.gov.br/api/v1/localidades/estados/$estado->id/municipios";
                $response_cidades = $client_cidades->request('GET', $url_cidades);

                $cidades = json_decode($response_cidades->getBody());

                $total_cidades = 0;
                foreach ($cidades as $cidade) {

                    $new_cidade = City::firstOrNew(
                        [
                            'name'       => $cidade->nome,
                            'state_id'   => $new_estado->id,
                            'country_id' => $brasil->id,
                        ]
                    );
                    $new_cidade->save();
                    $total_cidades++;
                }
                echo " -> Total de cidades: {$total_cidades}\n";
            }
        } catch (\Throwable $th) {
            throw $th;

            return false;
        }
    }
}
