<?php

namespace App\Controllers;

use CodeIgniter\RESTful\ResourceController;

class Cs extends ResourceController
{
    //문의 리스트
    public function csList()
    {
        $db = \Config\Database::connect();

        // POST JSON 파라미터 받기
        $request = $this->request->getJSON(true);
        $userSeq = isset($request['USER_SEQ']) ? $request['USER_SEQ'] : null;

        $builder = $db->table('CS_BOARD C')
            ->select('C.*, U.NICK_NAME, U.NAME, V.COMPANY_NAME, V.NAME')
            ->join('USER_LIST U', 'C.USER_SEQ = U.SEQ', 'left')
            ->join('VENDOR_LIST V', 'C.USER_SEQ = V.SEQ', 'left');

        //userSeq가 0이 아니면 본인이 쓴 글만 조회
        if( $userSeq !== 0 ){
            $builder->where('C.USER_SEQ', $userSeq);
        }

        $builder->orderBy('C.SEQ', 'DESC');

        $lists = $builder->get()->getResultArray();
        return $this->respond($lists, 200);
    }

    //문의 등록
    public function csRegister()
    {
        $db = \Config\Database::connect();
        $request = \Config\Services::request();
        date_default_timezone_set('Asia/Seoul');
        $regdate = date('Y-m-d H:i:s');

        // 기본 유효성 검사
        if (
            !$request->getPost('USER_SEQ') ||
            !$request->getPost('CATEGORY') ||
            !$request->getPost('TITLE') ||
            !$request->getPost('CONTENT')
        ) {
            return $this->respond([
                'status' => 'fail',
                'message' => '필수 값이 누락됐습니다.'
            ], 400);
        }

        $db->transBegin(); // 트랜잭션 시작

        try {
            // 첨부파일 처리
            $fileName = null;
            $fileNameOrigin = null;
            $files = $request->getFiles();

            if (isset($files['files']) && !empty($files['files'])) {
                $file = $files['files'][0]; // 첫 번째 파일만 처리
                if ($file && $file->isValid() && !$file->hasMoved()) {
                    $fileNameOrigin = $file->getClientName(); // 원본 파일명
                    $fileName = $file->getRandomName(); // 랜덤파일명 생성
                    $file->move(WRITEPATH . 'uploads/cs/', $fileName); // 저장
                }
            }

            // CS_BOARD에 문의 정보 등록
            $csData = [
                'USER_SEQ' => $request->getPost('USER_SEQ'),
                'CATEGORY' => $request->getPost('CATEGORY'),
                'TITLE' => $request->getPost('TITLE'),
                'CONTENT' => $request->getPost('CONTENT'),
                'STATUS' => '0', // 0: 대기중, 1: 답변완료
                'REGDATE' => $regdate
            ];

            // 파일이 있으면 파일 정보도 추가
            if ($fileName) {
                $csData['FILE_NAME'] = $fileName;
                $csData['FILE_NAME_ORIGIN'] = $fileNameOrigin;
            }

            $insertResult = $db->table('CS_BOARD')->insert($csData);
            if (!$insertResult) {
                $error = $db->error();
                return $this->respond([
                    'status' => 'fail',
                    'message' => 'Insert 실패: ' . $error['message']
                ], 500);
            }
            $csSeq = $db->insertID(); // 생성된 문의 SEQ값

            $db->transCommit();
            return $this->respond([
                'status' => 'success',
                'success' => true,
                'cs_seq' => $csSeq
            ], 201);
        } catch (\Exception $e) {
            $db->transRollback();
            return $this->respond([
                'status' => 'fail',
                'message' => 'DB 오류: ' . $e->getMessage()
            ], 500);
        }
    }

    //문의 상세
    public function csDetail($seq)
    {
        // DB 객체 얻기
        $db = \Config\Database::connect();

        $builder = $db->table('CS_BOARD C')
            ->select('C.*, U.NICK_NAME, U.NAME, V.COMPANY_NAME, V.NAME')
            ->join('USER_LIST U', 'C.USER_SEQ = U.SEQ', 'left')
            ->join('VENDOR_LIST V', 'C.USER_SEQ = V.SEQ', 'left');
        $item = $builder->where('C.seq', $seq)->get()->getRowArray();

        if($item){
            return $this->respond($item, 200);
        } else {
            return $this->respond([
                'status' => 'fail',
                'message' => '유효하지 않은 seq입니다.'
            ], 404);
        }
    }

    //답변 등록
    public function csAnswer()
    {
        $db = \Config\Database::connect();
        $request = $this->request->getJSON(true);
        date_default_timezone_set('Asia/Seoul');
        $answerDate = date('Y-m-d H:i:s');

        // 기본 유효성 검사
        if (
            !isset($request['CS_SEQ']) ||
            !isset($request['ANSWER']) ||
            !isset($request['ADMIN_SEQ'])
        ) {
            return $this->respond([
                'status' => 'fail',
                'message' => '필수 값이 누락됐습니다.'
            ], 400);
        }

        $db->transBegin(); // 트랜잭션 시작

        try {
            // CS_BOARD 업데이트
            $updateData = [
                'ADMIN_ANSWER' => $request['ANSWER'],
                'ANSWER_REGDATE' => $answerDate,
                'ADMIN_SEQ' => $request['ADMIN_SEQ'],
                'STATUS' => '1' // 답변완료 상태로 변경
            ];

            $updateResult = $db->table('CS_BOARD')
                ->where('SEQ', $request['CS_SEQ'])
                ->update($updateData);

            if (!$updateResult) {
                throw new \Exception('답변 등록에 실패했습니다.');
            }

            $db->transCommit();
            return $this->respond([
                'status' => 'success',
                'message' => '답변이 등록되었습니다.'
            ], 200);
        } catch (\Exception $e) {
            $db->transRollback();
            return $this->respond([
                'status' => 'fail',
                'message' => 'DB 오류: ' . $e->getMessage()
            ], 500);
        }
    }

    //상세 다운로드
    public function file($fileName)
    {
        helper('filesystem');
        $db = \Config\Database::connect();

        $path = WRITEPATH . 'uploads/cs/' . $fileName;

        if (!file_exists($path)) {
            return $this->failNotFound('파일을 찾을 수 없습니다.');
        }

        // DB에서 원본 파일명 조회
        $fileInfo = $db->table('CS_BOARD')
            ->select('FILE_NAME_ORIGIN')
            ->where('FILE_NAME', $fileName)
            ->get()
            ->getRowArray();

        $originalFileName = $fileInfo && $fileInfo['FILE_NAME_ORIGIN']
            ? $fileInfo['FILE_NAME_ORIGIN']
            : $fileName;

        return $this->response
            ->download($path, null)
            ->setFileName($originalFileName);
    }

    //문의 검색
    public function csSearch()
    {
        $db = \Config\Database::connect();

        // 요청 바디에서 filter와 keyword 추출
        $request = $this->request->getJSON(true);
        $userSeq = isset($request['USER_SEQ']) ? $request['USER_SEQ'] : null;
        $filter = isset($request['filter']) ? $request['filter'] : null;
        $keyword = isset($request['keyword']) ? $request['keyword'] : null;
        $startDate = isset($request['startDate']) ? $request['startDate'] : null;
        $endDate = isset($request['endDate']) ? $request['endDate'] : null;

        $filterMap = [
            'title' => 'C.TITLE',
            'content' => 'C.CONTENT',
            'writer' => 'WRITER',
        ];

        // CS_BOARD 테이블 검색
        $builder = $db->table('CS_BOARD C')
            ->select('C.*, U.NICK_NAME, U.NAME, V.COMPANY_NAME, V.NAME')
            ->join('USER_LIST U', 'C.USER_SEQ = U.SEQ', 'left')
            ->join('VENDOR_LIST V', 'C.USER_SEQ = V.SEQ', 'left');

        // userSeq가 0이 아니면 본인이 쓴 글만 조회
        if ($userSeq !== 0) {
            $builder->where('C.USER_SEQ', $userSeq);
        }

        // 키워드 검색
        if (!empty($keyword)) {
            if (empty($filter) || $filter === '') {
                // 필터를 선택 안했으면 전체 검색 (제목 + 내용 + 작성자)
                $builder->groupStart()
                    ->like('C.TITLE', $keyword)
                    ->orLike('C.CONTENT', $keyword)
                    ->orLike('U.NICK_NAME', $keyword)
                    ->orLike('U.NAME', $keyword)
                    ->orLike('V.COMPANY_NAME', $keyword)
                    ->orLike('V.NAME', $keyword)
                    ->groupEnd();
            } elseif (isset($filterMap[$filter])) {
                if ($filter === 'title') {
                    // 제목 검색
                    $builder->like($filterMap[$filter], $keyword);
                } elseif ($filter === 'content') {
                    // 내용 검색
                    $builder->like($filterMap[$filter], $keyword);
                } elseif ($filter === 'writer') {
                    // 작성자 검색
                    $builder->groupStart()
                        ->like('U.NICK_NAME', $keyword)
                        ->orLike('U.NAME', $keyword)
                        ->orLike('V.COMPANY_NAME', $keyword)
                        ->orLike('V.NAME', $keyword)
                        ->groupEnd();
                }
            }
        }

        // 날짜 범위 검색
        if (!empty($startDate)) {
            $builder->where('DATE(C.REGDATE) >=', $startDate);
        }
        if (!empty($endDate)) {
            $builder->where('DATE(C.REGDATE) <=', $endDate);
        }

        // 정렬: 최신순
        $builder->orderBy('C.SEQ', 'DESC');

        // 조회
        $lists = $builder->get()->getResultArray();

        return $this->respond($lists, 200);
    }
}