<?php

namespace App\Models;

use Core\Model;
use PDO;

class KKN extends Model
{
    protected $table = 'tb_kkn';

    public function findByNim($nim)
    {
        $stmt = $this->query("SELECT * FROM {$this->table} WHERE nim = ?", [$nim]);
        return $stmt->fetch();
    }

    public function insertFromMahasiswa($nim, $token)
    {
        if ($this->findByNim($nim)) {
            return false;
        }

        $sqlMahasiswa = "
            SELECT m.nim, m.nama, m.tmpt_lahir, m.tgl_lahir, m.jenis_kelamin, m.alamat, m.telpon, p.nama_prodi
            FROM tb_mahasiswa m
            INNER JOIN tb_prodi p ON m.id_prodi = p.id_prodi
            WHERE m.nim = ?
        ";

        $stmtMahasiswa = $this->getPDO()->prepare($sqlMahasiswa);
        $stmtMahasiswa->execute([$nim]);
        $dataMahasiswa = $stmtMahasiswa->fetch(PDO::FETCH_ASSOC);

        if (!$dataMahasiswa) {
            return false;
        }

        $sqlInsert = "
            INSERT INTO {$this->table} 
            (nim, nama, tmpt_lahir, tgl_lahir, jenis_kelamin, alamat, prodi, no_hp, tanggal_daftar, token)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, NOW(), ?)
        ";

        $stmtInsert = $this->getPDO()->prepare($sqlInsert);
        return $stmtInsert->execute([
            $dataMahasiswa['nim'],
            $dataMahasiswa['nama'],
            $dataMahasiswa['tmpt_lahir'],
            $dataMahasiswa['tgl_lahir'],
            $dataMahasiswa['jenis_kelamin'],
            $dataMahasiswa['alamat'],
            $dataMahasiswa['nama_prodi'],
            $dataMahasiswa['telpon'],
            $token
        ]);
    }

    public function updateByNim($nim, array $data)
    {
        // Validasi minimal fields yang diupdate:
        $fields = ['tmpt_lahir', 'tgl_lahir', 'jenis_kelamin', 'alamat', 'semester', 'no_hp', 'status_pekerjaan', 'status_perkawinan'];

        $setPart = [];
        $params = [];

        foreach ($fields as $field) {
            if (isset($data[$field])) {
                $setPart[] = "$field = ?";
                $params[] = $data[$field];
            }
        }

        if (empty($setPart)) {
            return false; // Tidak ada data untuk update
        }

        $params[] = $nim;

        $sql = "UPDATE {$this->table} SET " . implode(', ', $setPart) . " WHERE nim = ?";

        $stmt = $this->getPDO()->prepare($sql);
        return $stmt->execute($params);
    }

    protected function getPDO()
    {
        return $this->pdo;
    }
}
