<?php

namespace App\Models;

use Core\Model;
use PDO;

class PPLK extends Model
{
    protected $table = 'tb_pplk';

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

    private function getTahunAkademikAktif()
    {
        $sql = "SELECT tahun_akademik 
                FROM tb_akademik 
                WHERE status = 'Aktif' 
                LIMIT 1";
        return $this->getPDO()->query($sql)->fetchColumn();
    }

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

        // Ambil tahun akademik aktif
        $tahunAkademikAktif = $this->getTahunAkademikAktif();
        if (!$tahunAkademikAktif) {
            return false;
        }

        // Ambil data mahasiswa
        $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]);
        $mhs = $stmtMahasiswa->fetch(PDO::FETCH_ASSOC);

        if (!$mhs) {
            return false;
        }

        // Insert ke tb_pplk (LENGKAP & AMAN)
        $sqlInsert = "
            INSERT INTO {$this->table} (
                nim,
                nama,
                tmpt_lahir,
                tgl_lahir,
                prodi,
                semester,
                jenis_kelamin,
                no_hp,
                alamat,
                status_pekerjaan,
                status_perkawinan,
                tahun_akademik,
                tanggal_daftar,
                token
            ) VALUES (
                ?, ?, ?, ?, ?,
                ?, ?, ?, ?,
                ?, ?,
                ?, NOW(), ?
            )
        ";

        $stmtInsert = $this->getPDO()->prepare($sqlInsert);

        return $stmtInsert->execute([
            $mhs['nim'],
            $mhs['nama'],
            $mhs['tmpt_lahir'],
            $mhs['tgl_lahir'],
            $mhs['nama_prodi'],
            '-', // semester default
            $mhs['jenis_kelamin'],
            $mhs['telpon'],
            $mhs['alamat'],
            '-', // status_pekerjaan default
            '-', // status_perkawinan default
            $tahunAkademikAktif,
            $token
        ]);
    }

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

        $set = [];
        $params = [];

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

        if (empty($set)) {
            return false;
        }

        $params[] = $nim;

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

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

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