<?php

namespace App\Controllers;

use App\Models\TahunAkademikModel;

class TahunAkademik extends BaseController
{
    protected TahunAkademikModel $tahunAkademikModel;

    public function __construct()
    {
        $this->tahunAkademikModel = new TahunAkademikModel();
    }

    public function index()
    {
        $data = [
            'title'          => 'Data Tahun Akademik | SIAKAD ITKA',
            'tahun_akademik' => $this->tahunAkademikModel->orderBy('kode_ta', 'DESC')->findAll()
        ];

        return view('tahun_akademik/index', $data);
    }

    public function create()
    {
        $data = [
            'title'      => 'Tambah Tahun Akademik | SIAKAD ITKA',
            'validation' => \Config\Services::validation(),
            'action'     => base_url('tahun-akademik/store'),
            'ta'         => null
        ];

        return view('tahun_akademik/form', $data);
    }

    public function store()
    {
        if (!$this->validate([
            'kode_ta' => [
                'rules'  => 'required|is_unique[tahun_akademik.kode_ta]',
                'errors' => [
                    'required'  => 'Kode Tahun Akademik harus diisi.',
                    'is_unique' => 'Kode Tahun Akademik sudah terdaftar.'
                ]
            ],
            'nama_ta' => [
                'rules'  => 'required',
                'errors' => [
                    'required' => 'Nama Tahun Akademik harus diisi.'
                ]
            ]
        ])) {
            return redirect()->to('/tahun-akademik/create')->withInput();
        }

        $status = $this->request->getPost('status') ? 'Aktif' : 'Tidak Aktif';

        // Jika diset Aktif, nonaktifkan yang lain
        if ($status == 'Aktif') {
            $this->tahunAkademikModel->set(['status' => 'Tidak Aktif'])->where('id >', 0)->update();
        }

        $this->tahunAkademikModel->save([
            'kode_ta' => $this->request->getPost('kode_ta'),
            'nama_ta' => $this->request->getPost('nama_ta'),
            'status'  => $status
        ]);

        session()->setFlashdata('pesan', 'Data Tahun Akademik berhasil ditambahkan.');
        return redirect()->to('/tahun-akademik');
    }

    public function edit(string $id)
    {
        $data = [
            'title'      => 'Edit Tahun Akademik | SIAKAD ITKA',
            'validation' => \Config\Services::validation(),
            'action'     => base_url('tahun-akademik/update/' . $id),
            'ta'         => $this->tahunAkademikModel->find($id)
        ];

        if (empty($data['ta'])) {
            throw new \CodeIgniter\Exceptions\PageNotFoundException('Tahun Akademik tidak ditemukan');
        }

        return view('tahun_akademik/form', $data);
    }

    public function update(string $id)
    {
        $taLama = $this->tahunAkademikModel->find($id);
        if ($taLama['kode_ta'] == $this->request->getPost('kode_ta')) {
            $ruleKode = 'required';
        } else {
            $ruleKode = 'required|is_unique[tahun_akademik.kode_ta]';
        }

        if (!$this->validate([
            'kode_ta' => [
                'rules'  => $ruleKode,
                'errors' => [
                    'required'  => 'Kode Tahun Akademik harus diisi.',
                    'is_unique' => 'Kode Tahun Akademik sudah terdaftar.'
                ]
            ],
            'nama_ta' => [
                'rules'  => 'required',
                'errors' => [
                    'required' => 'Nama Tahun Akademik harus diisi.'
                ]
            ]
        ])) {
            return redirect()->to('/tahun-akademik/edit/' . $id)->withInput();
        }

        $status = $this->request->getPost('status') ? 'Aktif' : 'Tidak Aktif';

        // Jika diset Aktif, nonaktifkan yang lain
        if ($status == 'Aktif') {
            $this->tahunAkademikModel->set(['status' => 'Tidak Aktif'])->where('id >', 0)->update();
        }

        $this->tahunAkademikModel->save([
            'id'      => $id,
            'kode_ta' => $this->request->getPost('kode_ta'),
            'nama_ta' => $this->request->getPost('nama_ta'),
            'status'  => $status
        ]);

        session()->setFlashdata('pesan', 'Data Tahun Akademik berhasil diubah.');
        return redirect()->to('/tahun-akademik');
    }

    public function delete(string $id)
    {
        $this->tahunAkademikModel->delete($id);
        session()->setFlashdata('pesan', 'Data Tahun Akademik berhasil dihapus.');
        return redirect()->to('/tahun-akademik');
    }

    public function setAktif()
    {
        $id_ta = $this->request->getPost('id_ta');
        if ($id_ta) {
            // Nonaktifkan semua
            $this->tahunAkademikModel->set(['status' => 'Tidak Aktif'])->where('id >', 0)->update();
            
            // Aktifkan yang dipilih
            $this->tahunAkademikModel->save([
                'id' => $id_ta,
                'status' => 'Aktif'
            ]);

            session()->setFlashdata('pesan', 'Semester berlaku berhasil diperbarui.');
        }
        return redirect()->to('/tahun-akademik');
    }

    public function syncPddikti()
    {
        $neoFeeder = new \App\Services\NeoFeederService();
        $response = $neoFeeder->request('GetSemester');

        if (isset($response['error_code']) && $response['error_code'] == 0) {
            $dataSemester = $response['data'];
            
            // Get active period from GetPeriode
            $activePeriode = null;
            $resPeriode = $neoFeeder->request('GetPeriode');
            if (isset($resPeriode['error_code']) && $resPeriode['error_code'] == 0 && !empty($resPeriode['data'])) {
                $activePeriode = $resPeriode['data'][0]['periode_pelaporan'];
            }

            $count = 0;
            
            foreach ($dataSemester as $semester) {
                // Check if already exists by id_semester_pddikti or kode_ta
                $existing = $this->tahunAkademikModel->where('id_semester_pddikti', $semester['id_semester'])
                                                     ->orWhere('kode_ta', $semester['id_semester'])->first();
                
                $isNewActive = ($activePeriode && $activePeriode == $semester['id_semester']);

                if (!$existing) {
                    $this->tahunAkademikModel->save([
                        'kode_ta'             => $semester['id_semester'], // typically 20231 etc
                        'nama_ta'             => $semester['nama_semester'],
                        'status'              => $isNewActive ? 'Aktif' : 'Tidak Aktif',
                        'id_semester_pddikti' => $semester['id_semester']
                    ]);
                    $count++;
                } else {
                    // Update if exists to ensure nama_ta and status are synced
                    $updateData = [
                        'id'                  => $existing['id'],
                        'nama_ta'             => $semester['nama_semester'],
                        'id_semester_pddikti' => $semester['id_semester']
                    ];
                    
                    // Only overwrite status if we successfully fetched the active period from PDDIKTI
                    if ($activePeriode) {
                        $updateData['status'] = $isNewActive ? 'Aktif' : 'Tidak Aktif';
                    }

                    $this->tahunAkademikModel->save($updateData);
                }
            }

            session()->setFlashdata('pesan', "Berhasil sinkronisasi $count data Tahun Akademik dari PDDIKTI.");
        } else {
            $errorDesc = $response['error_desc'] ?? 'Gagal menarik data dari PDDIKTI';
            session()->setFlashdata('pesan', "<div style='color:red;'>$errorDesc</div>");
        }

        return redirect()->to('/tahun-akademik');
    }
    public function debugPddikti()
    {
        $neoFeeder = new \App\Services\NeoFeederService();
        $response = $neoFeeder->request('GetSemester', ['limit' => 5, 'order' => 'id_semester DESC']);
        echo "<pre>GetSemester 5 records:\n"; print_r($response); echo "</pre>";
        
        $response2 = $neoFeeder->request('GetPeriode');
        echo "<pre>GetPeriode:\n"; print_r($response2); echo "</pre>";
    }
}
