<?php
namespace App\Controllers\board;

use App\Controllers\BaseController;
use App\Libraries\MyUpload;
use App\Models\board\NoticeModel;

class Notice extends BaseController
{
    private $notice;

    public function __construct()
    {
        $this->notice = new NoticeModel();
    }

    public function notice(): string
    {
        return view('pages/board/notice', $this->data);
    }


    public function getNoticeList()
    {

        $start = (int) $this->request->getGet('start') ?: 0;
        $end = (int) $this->request->getGet('length') ?: 10;

        $data = [
            'srchType' => $this->request->getGet('srchType') ?: '',
            'srchTxt' => $this->request->getGet('srchTxt') ?: '',
        ];

        $totalCount = $this->notice->getTotalCount($data);


        $datas = $this->notice->getNoticeList($start, $end, $data);

        return $this->response->setJSON(body: [
            'recordsTotal' => $totalCount,
            'recordsFiltered' => $totalCount,
            'data' => $datas,
        ]);

    }


    // 공지사항 상세
    public function detail($id = null)
    {
        $id = (int) $id;

        if ($id <= 0) {
            throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
        }

        // 데이터 조회
        $data = $this->notice->getNoticeData($id);

        if (!$data) {
            throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
        }

        return view('pages/board/noticeDetail', array_merge($this->data, $data));
    }

    // 첨부파일 다운로드
    public function download($fileSq = null)
    {
        $fileSq = (int) $fileSq;

        if ($fileSq <= 0) {
            throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
        }

        // 1) DB에서 파일 정보 조회
        $fileInfo = $this->notice->getFile($fileSq);

        if (!$fileInfo) {
            throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
        }

        // DB에 이렇게 저장했다고 가정:
        // file_path : /var/www/html/writable/upload/notice
        // file_name : 실제 서버 파일명 (orig or new)

        // dd($fileInfo);

        $filePath = rtrim($fileInfo['file_path'], '/\\') . DIRECTORY_SEPARATOR . $fileInfo['file_name'];

        if (!is_file($filePath)) {
            throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
        }

        // 브라우저에 보여줄 다운로드 파일명 (원본 이름)
        $downloadName = $fileInfo['orig_name'];

        // 2) CI4 내장 다운로드 헬퍼 사용
        return $this->response->download($filePath, null)->setFileName($downloadName);
    }


    // 공지사항 작성 화면
    public function write(): string
    {
        return view('pages/board/noticeWrite', $this->data);
    }

    // 공지사항 작성
    public function actWrite()
    {
        $lib = new MyUpload();

        try {


            $data = [
                'subject' => $this->request->getPost('subject'),
                'content' => $this->request->getPost('content'),
                'insert_usr' => session()->get('usr_id'),
                'insert_nm' => session()->get('usr_nm'),
            ];



            $file = $this->request->getFile('file');

            if ($file && $file->isValid() && !$file->hasMoved()) {

                $uploadPath = "/upload/notice/" . date('Ymd') . "/";

                $arrUploadfile = [];
                if ($file->isValid() && !$file->hasMoved()) {
                    $uploadData = $lib->do_upload2($file, $uploadPath);

                    if ($uploadData !== false) {
                        $arrUploadfile[] = $uploadData;
                    }
                }

                if (!empty($arrUploadfile)) {
                    foreach ($arrUploadfile as $key => $uploadFile) {
                        $data['file'] = [
                            'file_sq' => $this->request->getPost('file_sq'),
                            'orig_name' => $uploadFile['origin_name'],
                            'new_name' => $uploadFile['file_name'],
                            'file_path' => $uploadPath, // 필요에 따라 상대경로로만 저장
                            'ext' => '.' . $uploadFile['ext'],
                            'size' => $file->getSize(),
                            'img_yn' => null,
                            // 높이/폭은 나중에 getimagesize 등으로 구해도 됨
                            'img_height' => null,
                            'img_width' => null,
                        ];
                    }

                }

                /*
                $origName = $file->getClientName();
                $ext = $file->getClientExtension();
                $size = $file->getSize();
                $mime = $file->getMimeType();
                $type = $file->getClientMimeType();
                $tempName = $file->getTempName();
                $imgYn = (strpos($mime, 'image/') === 0) ? 'Y' : 'N';

                // 저장 경로
                $saveDir = WRITEPATH . 'upload/notice';
                if (!is_dir($saveDir)) {
                    mkdir($saveDir, 0777, true);
                }

                // 서버 저장 이름 (덮어쓰기 방지를 위해 랜덤으로 추천)
                $newName = $file->getRandomName();
                $file->move($saveDir, $newName);

                // 모델로 넘길 파일 정보
                $data['file'] = [
                    'orig_name' => $origName,
                    'new_name' => $newName,
                    'file_path' => $saveDir,
                    'ext' => $ext,
                    'size' => $size,
                    'img_yn' => $imgYn,
                    'img_height' => null,
                    'img_width' => null,
                ];

                */
            }


            $result = $this->notice->write($data);


            return $this->response->setJSON([
                'code' => '0',
                'msg' => 'success'
            ]);

        } catch (\Exception $e) {
            log_message('error', '[LOGIN ERROR] ' . $e->getMessage());
            return $this->response->setJSON([
                'code' => '9',
                'msg' => $e->getMessage(),
            ]);
        }

    }

    // 공지사항 수정
    public function modify($id = null): string
    {

        $id = (int) $id;


        if ($id <= 0) {
            throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
        }

        // 데이터 조회
        $data = $this->notice->getNoticeData($id);

        if (!$data) {
            throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
        }


        return view('pages/board/noticeModify', array_merge($this->data, $data));

    }

    // 공지사항 수정요청
    public function actModify()
    {
        $lib = new MyUpload();

        try {

            $data = [
                'bbs_sq' => $this->request->getPost('bbs_sq'),
                'subject' => $this->request->getPost('subject'),
                'content' => $this->request->getPost('content'),
                'update_usr' => session()->get('usr_id'),
                'update_nm' => session()->get('usr_nm'),
            ];



            $file = $this->request->getFile('file');

            if ($file && $file->isValid() && !$file->hasMoved()) {
                $uploadPath = "/upload/notice/" . date('Ymd') . "/";

                $arrUploadfile = [];
                if ($file->isValid() && !$file->hasMoved()) {
                    $uploadData = $lib->do_upload2($file, $uploadPath);

                    if ($uploadData !== false) {
                        $arrUploadfile[] = $uploadData;
                    }
                }

                if (!empty($arrUploadfile)) {
                    foreach ($arrUploadfile as $key => $uploadFile) {
                        $data['file'] = [
                            'file_sq' => $this->request->getPost('file_sq'),
                            'orig_name' => $uploadFile['origin_name'],
                            'new_name' => $uploadFile['file_name'],
                            'file_path' => $uploadPath, // 필요에 따라 상대경로로만 저장
                            'ext' => '.' . $uploadFile['ext'],
                            'size' => $file->getSize(),
                            'img_yn' => null,
                            // 높이/폭은 나중에 getimagesize 등으로 구해도 됨
                            'img_height' => null,
                            'img_width' => null,
                        ];
                    }

                }

                /*
                $origName = $file->getClientName();
                $ext = $file->getClientExtension();
                $size = $file->getSize();
                $mime = $file->getMimeType();     // ★ move() 전에!
                $type = $file->getClientMimeType();
                $tempName = $file->getTempName();
                $imgYn = (strpos($mime, 'image/') === 0) ? 'Y' : 'N';

                // 저장 경로
                $saveDir = WRITEPATH . 'upload/notice';
                if (!is_dir($saveDir)) {
                    mkdir($saveDir, 0777, true);
                }

                // 서버 저장 이름 (덮어쓰기 방지를 위해 랜덤으로 추천)
                $newName = $file->getRandomName();
                $file->move($saveDir, $newName);

                // 모델로 넘길 파일 정보
                $data['file'] = [
                    'file_sq' => $this->request->getPost('file_sq'),
                    'orig_name' => $origName,
                    'new_name' => $newName,
                    'file_path' => $saveDir, // 필요에 따라 상대경로로만 저장
                    'ext' => $ext,
                    'size' => $size,
                    'img_yn' => $imgYn,
                    // 높이/폭은 나중에 getimagesize 등으로 구해도 됨
                    'img_height' => null,
                    'img_width' => null,
                ];

                */
            }


            $result = $this->notice->modify($data);


            return $this->response->setJSON([
                'code' => '0',
                'msg' => 'success'
            ]);

        } catch (\Exception $e) {
            log_message('error', '[LOGIN ERROR] ' . $e->getMessage());
            return $this->response->setJSON([
                'code' => '9',
                'msg' => $e->getMessage(),
            ]);
        }

    }

    // 공지사항 삭제요청
    public function actRemove()
    {
        try {

            $data = [
                'bbs_sq' => $this->request->getPost('bbs_sq'),
                'update_usr' => session()->get('usr_id'),
                'update_nm' => session()->get('usr_nm'),
            ];

            $this->notice->remove($data);

            return $this->response->setJSON([
                'code' => '0',
                'msg' => 'success'
            ]);


        } catch (\Exception $e) {
            log_message('error', '[LOGIN ERROR] ' . $e->getMessage());
            return $this->response->setJSON([
                'code' => '9',
                'msg' => $e->getMessage(),
            ]);
        }
    }
}