<?php

namespace Database\Seeders;

// use Illuminate\Database\Console\Seeds\WithoutModelEvents;

use App\Models\Contact;
use App\Models\Notification;
use App\Models\NotificationReceiver;
use App\Models\Refund;
use App\Models\RefundDescription;
use Illuminate\Database\Seeder;
use App\Models\User;
use Carbon\Carbon;
use App\Models\Setting;
use App\Models\Transaction;
use App\Models\TransactionDescription;
use Illuminate\Support\Str;
use Faker\Factory as FakerFactory;
use Faker\Provider\id_ID\Person as Person;
use Laravolt\Indonesia\Seeds\CitiesSeeder;
use Laravolt\Indonesia\Seeds\VillagesSeeder;
use Laravolt\Indonesia\Seeds\DistrictsSeeder;
use Laravolt\Indonesia\Seeds\ProvincesSeeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     */
    public function run(): void
    {
        $faker = FakerFactory::create();
        $faker->addProvider(new Person($faker));

        User::factory()->create([
            'id' => Str::uuid(),
            'nama_depan' => $faker->firstName,
            'nama_belakang' => $faker->lastName,
            'tanggal_lahir' => $faker->date('Y-m-d', 'now'),
            'email' => 'admin@example.net',
            'email_verified_at' => now(),
            'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
            'remember_token' => Str::random(10),
            'role' => 'Admin',
            'nik' => $faker->nik($faker->randomElement(['male', 'female']), $faker->dateTimeBetween('-65 years', '-18 years')),
            'alamat' => $faker->address,
            'nohp' => $faker->phoneNumber(),
            'status' => 'Finished',
            'persentase_kemiripan' => 100,
            'gender' => $faker->randomElement(['Laki-laki', 'Perempuan']),
            'kode_kelurahan' => '1101012002',
            'foto_profile' => 'face1.jpg'
        ]);

        $user1 = User::factory()->create([
            'id' => Str::uuid(),
            'nama_depan' => $faker->firstName,
            'nama_belakang' => $faker->lastName,
            'tanggal_lahir' => $faker->date('Y-m-d', 'now'),
            'email' => $faker->email,
            'email_verified_at' => now(),
            'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
            'remember_token' => Str::random(10),
            'role' => 'User',
            'nik' => $faker->nik($faker->randomElement(['male', 'female']), $faker->dateTimeBetween('-65 years', '-18 years')),
            'alamat' => $faker->address,
            'nohp' => $faker->phoneNumber(),
            'status' => 'Finished',
            'persentase_kemiripan' => 100,
            'gender' => $faker->randomElement(['Laki-laki', 'Perempuan']),
            'kode_kelurahan' => '1101012002',
            'nama_bank' => 'mandiri',
            'no_rek' => '019809210873',
            'keterangan' => $faker->sentence(),
            'foto_profile' => 'face2.jpg'
        ]);

        $user2 = User::factory()->create([
            'id' => Str::uuid(),
            'nama_depan' => $faker->firstName,
            'nama_belakang' => $faker->lastName,
            'tanggal_lahir' => $faker->date('Y-m-d', 'now'),
            'email' => $faker->email(),
            'email_verified_at' => now(),
            'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
            'remember_token' => Str::random(10),
            'role' => 'User',
            'nik' => $faker->nik($faker->randomElement(['male', 'female']), $faker->dateTimeBetween('-65 years', '-18 years')),
            'alamat' => $faker->address,
            'nohp' => $faker->phoneNumber(),
            'status' => 'Finished',
            'persentase_kemiripan' => 100,
            'gender' => $faker->randomElement(['Laki-laki', 'Perempuan']),
            'kode_kelurahan' => '1101012002',
            'nama_bank' => 'bca',
            'no_rek' => '01980921',
            'keterangan' => $faker->sentence(),
            'foto_profile' => 'face3.jpg'
        ]);

        User::factory(100)->create();

        $now = Carbon::now()->tz('Asia/Jakarta');
        $bulan = $now->format('n');
        $tahun = $now->year;
        Setting::create([
            'id' => Str::uuid(),
            'bulan' => $bulan,
            'tahun' => $tahun,
            'persentase' => 5,
            'status' => 'Active',
        ]);

        $transaction = Transaction::create([
            'id' => Str::uuid(),
            'pembeli' => $user1->email,
            'penjual' => $user2->email,
            'nama_barang' => 'hah',
            'deskripsi_transaksi' => null,
            'satuan_barang' => 'barang',
            'harga_barang' => 2000,
            'jumlah_barang' => 2,
            'persentase_keuntungan' => 2,
            'total_keuntungan' => 2,
            'total_harga' => 2,
            'total_bayar' => 2,
            'token' => 'asda',
            'status_transaksi' => 'created',
            'batas_pembayaran' => now(),
            'batas_pengiriman_barang_akhir' => now(),
            'nama_bank_penjual' => $user2->nama_bank,
            'no_rek_penjual' => $user2->no_rek,
        ]);

        TransactionDescription::create([
            'transaction_id' => $transaction->id,
            'status' => 'pending',
            'user' => $user1->email,
            'judul' => 'fa fa-plus',
            'background' => 'bg-buyer',
            'deskripsi' => $user1->nama_depan . ' telah membuat transaksi baru dengan ' . $user2->nama_depan,
        ]);

        $transaction = Transaction::create([
            'id' => Str::uuid(),
            'pembeli' => $user2->email,
            'penjual' => $user1->email,
            'nama_barang' => 'hah',
            'deskripsi_transaksi' => null,
            'satuan_barang' => 'barang',
            'harga_barang' => 2000,
            'jumlah_barang' => 2,
            'persentase_keuntungan' => 2,
            'total_keuntungan' => 2,
            'total_harga' => 2,
            'total_bayar' => 2,
            'token' => 'asda',
            'status_transaksi' => 'created',
            'batas_pembayaran' => now(),
            'batas_pengiriman_barang_akhir' => now(),
            'nama_bank_penjual' => $user1->nama_bank,
            'no_rek_penjual' => $user1->no_rek,
        ]);

        TransactionDescription::create([
            'transaction_id' => $transaction->id,
            'status' => 'pending',
            'user' => $user2->email,
            'judul' => 'fa fa-plus',
            'background' => 'bg-buyer',
            'deskripsi' => $user2->nama_depan . ' telah membuat transaksi baru dengan ' . $user1->nama_depan,
        ]);

        $transactionRefund = Transaction::create([
            'id' => Str::uuid(),
            'pembeli' => $user1->email,
            'penjual' => $user2->email,
            'nama_barang' => 'hah',
            'deskripsi_transaksi' => null,
            'satuan_barang' => 'barang',
            'harga_barang' => 2000,
            'jumlah_barang' => 2,
            'persentase_keuntungan' => 2,
            'total_keuntungan' => 2,
            'total_harga' => 2,
            'total_bayar' => 2,
            'token' => 'asda',
            'status_transaksi' => 'success',
            'status_pembayaran' => 'refund',
            'batas_pembayaran' => now(),
            'batas_pengiriman_barang_akhir' => now(),
            'nama_bank_penjual' => $user2->nama_bank,
            'no_rek_penjual' => $user2->no_rek,
        ]);

        $refund = Refund::create([
            'transaction_id' => $transactionRefund->id,
            'total' => $transactionRefund->total_harga,
            'due_date' => now(),
            'complaint' => 'ha',
        ]);

        RefundDescription::create([
            'refund_id' => $refund->id,
            'filename' => 'img_1.jpg',
            'type' => 'image'
        ]);

        RefundDescription::create([
            'refund_id' => $refund->id,
            'filename' => 'img_2.jpg',
            'type' => 'image'
        ]);

        Contact::create([
            'pemilik_kontak' => $user1->email,
            'relasi_kontak' => $user2->email
        ]);

        Contact::create([
            'pemilik_kontak' => $user2->email,
            'relasi_kontak' => $user1->email
        ]);

        $notification1 = Notification::create([
            'title' => 'Selamat Datang di Rekber',
            'content' => 'Hai, selamat datang di Rekber. Anda dapat menikmati bertransaksi disini',
            'teaser' => 'Hai, selamat datang di Rekber. ...'
        ]);

        NotificationReceiver::create([
            'notification_id' => $notification1->id,
            'receiver' => $user1->email
        ]);

        NotificationReceiver::create([
            'notification_id' => $notification1->id,
            'receiver' => $user2->email
        ]);

        $this->call([ProvincesSeeder::class, CitiesSeeder::class, DistrictsSeeder::class, VillagesSeeder::class]);
    }
}