<?php

namespace App\Controllers;

use CodeIgniter\RESTful\ResourceController;

class Deli extends ResourceController
{
    //아이템 리스트
    public function itemlist()
    {
        $db = \Config\Database::connect();

        // POST JSON 파라미터 받기
        $request = $this->request->getJSON(true);

        $itemType = isset($request['TYPE']) ? $request['TYPE'] : null;
        $showYn = isset($request['SHOW_YN']) ? $request['SHOW_YN'] : null;
        $infSeq = isset($request['INF_SEQ']) ? $request['INF_SEQ'] : null;
        $memberType = isset($request['MEMBER_TYPE']) ? $request['MEMBER_TYPE'] : null;
        $companyNumber = isset($request['COMPANY_NUMBER']) ? $request['COMPANY_NUMBER'] : null;

        // 서브쿼리: 사용자 타입에 따른 주문 집계
        $subQuery = $db->table('ITEM_ORDER_LIST')
            ->select('ITEM_SEQ, SUM(QTY) AS sum_qty, SUM(TOTAL) AS sum_total, MAX(REG_DATE) AS latest_reg_date');

        // 인플루언서: 본인이 받은 주문만
        if ($memberType === 'INFLUENCER') {
            if (is_null($infSeq)) {
                // INF_SEQ가 없으면 빈 결과 반환
                return $this->respond([], 200);
            }
            $subQuery->where('INF_SEQ', $infSeq);
        }

        // 배송정보가 등록되지 않은 주문만 (배송관리 페이지용)
        // 배송업체와 송장번호가 모두 비어있는 경우만 포함 (AND 조건)
        $subQuery->where('(DELI_COMP IS NULL OR DELI_COMP = "")')
                 ->where('(DELI_NUMB IS NULL OR DELI_NUMB = "")');

        $subQuery->groupBy('ITEM_SEQ');

        // 메인 쿼리: ITEM_LIST와 위 서브쿼리 조인 (실제 주문이 있는 제품만)
        $builder = $db->table('ITEM_LIST I')
            ->select('I.*, O.sum_qty, O.sum_total, O.latest_reg_date')
            ->join("(" . $subQuery->getCompiledSelect() . ") O", 'I.SEQ = O.ITEM_SEQ', 'inner')
            ->where('I.DEL_YN', 'N');

        // 벤더: 자사 제품만 필터링
        if ($memberType === 'VENDOR') {
            if (empty($companyNumber)) {
                // COMPANY_NUMBER가 없으면 빈 결과 반환
                return $this->respond([], 200);
            }
            $builder->where('I.COMPANY_NUMBER', $companyNumber);
        }

        if (!is_null($showYn) && $showYn !== '') {
            $builder->where('I.SHOW_YN', $showYn);
        }

        $builder->where('I.TYPE', $itemType);

        $builder->orderBy('I.UDPDATE', 'DESC');

        $lists = $builder->get()->getResultArray();


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


    //구매자 리스트
    public function delilist()
    {
        $db = \Config\Database::connect();
        $request = $this->request->getJSON(true);
        $itemSeq = isset($request['item_seq']) ? $request['item_seq'] : null;
        $infSeq = isset($request['inf_seq']) ? $request['inf_seq'] : null;

        // 쿼리 빌더
        $builder = $db->table('ITEM_ORDER_LIST I');
        $builder->select('I.*, U.NICK_NAME');
        $builder->join('USER_LIST U', 'I.INF_SEQ = U.SEQ', 'left');

        $builder->where('I.ITEM_SEQ', $itemSeq);
        if ($infSeq) {
            $builder->where('I.INF_SEQ', $infSeq);
        }

        // 배송정보가 등록되지 않은 주문만 표시 (송장번호 등록용)
        // 배송업체와 송장번호가 모두 비어있는 경우만 포함
        $builder->where('(I.DELI_COMP IS NULL OR I.DELI_COMP = "")')
                ->where('(I.DELI_NUMB IS NULL OR I.DELI_NUMB = "")');

        // 주문일 기준으로 정렬
        $builder->orderBy('I.ORDER_DATE', 'DESC');
        $lists = $builder->get()->getResultArray();


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

    //구매자 등록
    public function deliRegister()
    {
        $db = \Config\Database::connect();
        $request = $this->request->getJSON(true);

        $itemSeq = isset($request['item_seq']) ? $request['item_seq'] : null;
        $infSeq = isset($request['inf_seq']) ? $request['inf_seq'] : null;
        $deliveryList = $request['deliveryList'] ?? [];

        // 🔍 먼저 전체 유효성 검사
        foreach ($deliveryList as $index => $delivery) {
            $requiredFields = ['buyerName', 'address', 'phone', 'qty', 'total', 'orderDate'];
            foreach ($requiredFields as $field) {
                if (!isset($delivery[$field]) || $delivery[$field] === '') {
                    return $this->fail("deliveryList[$index] 항목의 '{$field}' 값이 누락되었습니다.", 400);
                }
            }
        }

        // ✅ 유효성 통과 후 삭제 + 삽입
        $db->table('ITEM_ORDER_LIST')
            ->where('ITEM_SEQ', $itemSeq)
            ->where('INF_SEQ', $infSeq)
            ->delete();

        foreach ($deliveryList as $delivery) {
            $data = [
                'ITEM_SEQ' => $itemSeq,
                'INF_SEQ' => $infSeq,
                'BUYER_NAME' => $delivery['buyerName'],
                'ADDRESS' => $delivery['address'],
                'PHONE' => $delivery['phone'],
                'EMAIL' => $delivery['email'],
                'QTY' => $delivery['qty'],
                'TOTAL' => $delivery['total'],
                'DELI_COMP' => $delivery['deliComp'] ?? '',
                'DELI_NUMB' => $delivery['deliNumb'] ?? '',
                'ORDER_DATE' => date('Y-m-d H:i:s', strtotime($delivery['orderDate'])),
                'REG_DATE' => date('Y-m-d'),
            ];

            $db->table('ITEM_ORDER_LIST')->insert($data);
        }

        return $this->respond(['message' => '배송 데이터가 성공적으로 저장되었습니다.'], 200);
    }

    //벤더사용 배송정보 업데이트
    public function updateDeliveryInfo()
    {
        $db = \Config\Database::connect();
        $request = $this->request->getJSON(true);

        $itemSeq = isset($request['item_seq']) ? $request['item_seq'] : null;
        $deliveryUpdates = $request['deliveryUpdates'] ?? [];

        if (!$itemSeq || empty($deliveryUpdates)) {
            return $this->fail('필수 파라미터가 누락되었습니다.', 400);
        }

        $db->transBegin();
        $updatedCount = 0;
        $errors = [];

        try {
            foreach ($deliveryUpdates as $update) {
                $buyerName = $update['buyerName'] ?? '';
                $phone = $update['phone'] ?? '';
                $deliComp = $update['deliComp'] ?? '';
                $deliNumb = $update['deliNumb'] ?? '';

                if (!$buyerName || !$phone) {
                    $errors[] = "구매자명과 연락처는 필수입니다.";
                    continue;
                }

                // 업데이트할 데이터 준비
                $updateData = [
                    'DELI_COMP' => $deliComp,
                    'DELI_NUMB' => $deliNumb
                ];

                // 배송업체와 송장번호가 모두 있을 때만 DELIVERY_STATUS를 SHIPPING으로 변경
                $columns = $db->getFieldNames('ITEM_ORDER_LIST');
                if (in_array('DELIVERY_STATUS', $columns)) {
                    if (!empty($deliComp) && !empty($deliNumb)) {
                        $updateData['DELIVERY_STATUS'] = 'SHIPPING';
                        
                        // 배송 시작일도 함께 업데이트
                        if (in_array('SHIPPING_DATE', $columns)) {
                            $updateData['SHIPPING_DATE'] = date('Y-m-d H:i:s');
                        }
                    }
                }

                // 구매자명과 연락처로 해당 주문 찾기
                $result = $db->table('ITEM_ORDER_LIST')
                    ->where('ITEM_SEQ', $itemSeq)
                    ->where('BUYER_NAME', $buyerName)
                    ->where('PHONE', $phone)
                    ->update($updateData);

                if ($result) {
                    $updatedCount++;
                } else {
                    $errors[] = "매칭되는 주문을 찾을 수 없습니다: {$buyerName}({$phone})";
                }
            }

            if ($updatedCount > 0) {
                $db->transCommit();
                return $this->respond([
                    'message' => "배송정보가 성공적으로 업데이트되었습니다.",
                    'updated_count' => $updatedCount,
                    'errors' => $errors
                ], 200);
            } else {
                $db->transRollback();
                return $this->fail('업데이트할 수 있는 데이터가 없습니다.', 400);
            }

        } catch (\Exception $e) {
            $db->transRollback();
            return $this->fail('배송정보 업데이트 중 오류가 발생했습니다: ' . $e->getMessage(), 500);
        }
    }

    //아이템 상세
    public function itemDetail($seq)
    {
        // DB 객체 얻기
        $db = \Config\Database::connect();

        $builder = $db->table('ITEM_LIST');
        $item = $builder->where('seq', $seq)->get()->getRowArray();

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

    //아이템 삭제
    public function itemDelete($seq)
    {
        $db = \Config\Database::connect();
        $db->transBegin();

        //아이템 삭제
        $deleted = $db->table('ITEM_LIST')
            ->where('SEQ', $seq)
            ->update(['DEL_YN' => 'Y']);

        if ($db->transStatus() === false || !$deleted) {
            $db->transRollback();
            return $this->respond(['status' => 'fail', 'message' => '이벤트 삭제 중 오류가 발생했습니다.']);
        }
        $db->transCommit();
        return $this->respond(['status' => 'success', 'message' => '이벤트가 삭제되었습니다.'], 200);
    }

    // 배송중 리스트 조회
    public function getShippingList()
    {
        $db = \Config\Database::connect();
        $request = $this->request->getJSON(true);
        
        $memberType = isset($request['MEMBER_TYPE']) ? $request['MEMBER_TYPE'] : null;
        $companyNumber = isset($request['COMPANY_NUMBER']) ? $request['COMPANY_NUMBER'] : null;
        $infSeq = isset($request['INF_SEQ']) ? $request['INF_SEQ'] : null;

        $builder = $db->table('ITEM_ORDER_LIST IOL')
            ->select('IOL.*, IL.NAME as ITEM_NAME, IL.PRICE1, IL.PRICE2')
            ->join('ITEM_LIST IL', 'IOL.ITEM_SEQ = IL.SEQ', 'inner')
            ->where('IOL.DELI_COMP !=', '')
            ->where('IOL.DELI_NUMB !=', '')
            ->where('IOL.DELI_COMP IS NOT NULL')
            ->where('IOL.DELI_NUMB IS NOT NULL');

        // DELIVERY_STATUS 컬럼이 존재하는지 확인하고 조건 추가
        $columns = $db->getFieldNames('ITEM_ORDER_LIST');
        if (in_array('DELIVERY_STATUS', $columns)) {
            $builder->where('IOL.DELIVERY_STATUS', 'SHIPPING');
        } else {
            // DELIVERY_STATUS 컬럼이 없으면 배송업체와 송장번호가 있는 것을 배송중으로 간주
            // 단, 배송완료된 것은 제외 (DELIVERED_DATE가 없는 것만)
            if (in_array('DELIVERED_DATE', $columns)) {
                $builder->where('IOL.DELIVERED_DATE IS NULL');
            }
        }

        // 사용자 타입에 따른 필터링
        if ($memberType === 'VENDOR' && !empty($companyNumber)) {
            $builder->where('IL.COMPANY_NUMBER', $companyNumber);
        } elseif ($memberType === 'INFLUENCER' && !empty($infSeq)) {
            $builder->where('IOL.INF_SEQ', $infSeq);
        }

        $builder->orderBy('IOL.REG_DATE', 'DESC');
        $lists = $builder->get()->getResultArray();


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

    // 배송완료 리스트 조회
    public function getDeliveredList()
    {
        $db = \Config\Database::connect();
        $request = $this->request->getJSON(true);
        
        $memberType = isset($request['MEMBER_TYPE']) ? $request['MEMBER_TYPE'] : null;
        $companyNumber = isset($request['COMPANY_NUMBER']) ? $request['COMPANY_NUMBER'] : null;
        $infSeq = isset($request['INF_SEQ']) ? $request['INF_SEQ'] : null;

        $builder = $db->table('ITEM_ORDER_LIST IOL')
            ->select('IOL.*, IL.NAME as ITEM_NAME, IL.PRICE1, IL.PRICE2')
            ->join('ITEM_LIST IL', 'IOL.ITEM_SEQ = IL.SEQ', 'inner');

        // DELIVERY_STATUS 컬럼이 존재하는지 확인하고 조건 추가
        $columns = $db->getFieldNames('ITEM_ORDER_LIST');
        if (in_array('DELIVERY_STATUS', $columns)) {
            $builder->where('IOL.DELIVERY_STATUS', 'DELIVERED');
        } else {
            // DELIVERY_STATUS 컬럼이 없으면 배송업체와 송장번호가 있는 것을 배송완료로 간주
            $builder->where('IOL.DELI_COMP !=', '')
                    ->where('IOL.DELI_NUMB !=', '')
                    ->where('IOL.DELI_COMP IS NOT NULL')
                    ->where('IOL.DELI_NUMB IS NOT NULL');
        }

        // 정산완료되지 않은 주문만 표시 (배송완료 페이지용)
        if (in_array('SETTLEMENT_STATUS', $columns)) {
            $builder->where('(IOL.SETTLEMENT_STATUS IS NULL OR IOL.SETTLEMENT_STATUS != "COMPLETED")');
        }

        // 사용자 타입에 따른 필터링
        if ($memberType === 'VENDOR' && !empty($companyNumber)) {
            $builder->where('IL.COMPANY_NUMBER', $companyNumber);
        } elseif ($memberType === 'INFLUENCER' && !empty($infSeq)) {
            $builder->where('IOL.INF_SEQ', $infSeq);
        }

        // 정렬을 안전하게 처리
        if (in_array('DELIVERED_DATE', $columns)) {
            $builder->orderBy('IOL.DELIVERED_DATE', 'DESC');
        } else {
            $builder->orderBy('IOL.REG_DATE', 'DESC');
        }
        
        $lists = $builder->get()->getResultArray();


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

    // 배송완료 처리
    public function markAsDelivered()
    {
        $db = \Config\Database::connect();
        $request = $this->request->getJSON(true);
        
        $orderIds = isset($request['order_ids']) ? $request['order_ids'] : [];
        
        if (empty($orderIds)) {
            return $this->fail('처리할 주문이 선택되지 않았습니다.', 400);
        }

        $db->transBegin();
        
        try {
            foreach ($orderIds as $orderId) {
                $db->table('ITEM_ORDER_LIST')
                    ->where('SEQ', $orderId)
                    ->update([
                        'DELIVERY_STATUS' => 'DELIVERED',
                        'DELIVERED_DATE' => date('Y-m-d H:i:s')
                    ]);
            }
            
            $db->transCommit();
            return $this->respond(['message' => '배송완료 처리되었습니다.'], 200);
            
        } catch (\Exception $e) {
            $db->transRollback();
            return $this->fail('배송완료 처리 중 오류가 발생했습니다: ' . $e->getMessage(), 500);
        }
    }

    // 정산완료 처리
    public function markAsSettled()
    {
        $db = \Config\Database::connect();
        $request = $this->request->getJSON(true);
        
        $orderIds = isset($request['order_ids']) ? $request['order_ids'] : [];
        
        if (empty($orderIds)) {
            return $this->fail('처리할 주문이 선택되지 않았습니다.', 400);
        }

        $db->transBegin();
        
        try {
            foreach ($orderIds as $orderId) {
                $db->table('ITEM_ORDER_LIST')
                    ->where('SEQ', $orderId)
                    ->update([
                        'SETTLEMENT_STATUS' => 'COMPLETED',
                        'SETTLED_DATE' => date('Y-m-d H:i:s')
                    ]);
            }
            
            $db->transCommit();
            return $this->respond(['message' => '정산완료 처리되었습니다.'], 200);
            
        } catch (\Exception $e) {
            $db->transRollback();
            return $this->fail('정산완료 처리 중 오류가 발생했습니다: ' . $e->getMessage(), 500);
        }
    }

    // 정산관리 리스트 조회
    public function getSettlementList()
    {
        $db = \Config\Database::connect();
        $request = $this->request->getJSON(true);
        
        $memberType = isset($request['MEMBER_TYPE']) ? $request['MEMBER_TYPE'] : null;
        $companyNumber = isset($request['COMPANY_NUMBER']) ? $request['COMPANY_NUMBER'] : null;
        $infSeq = isset($request['INF_SEQ']) ? $request['INF_SEQ'] : null;
        $settlementStatus = isset($request['SETTLEMENT_STATUS']) ? $request['SETTLEMENT_STATUS'] : null;

        $builder = $db->table('ITEM_ORDER_LIST IOL')
            ->select('IOL.*, IL.NAME as ITEM_NAME, IL.PRICE1, IL.PRICE2')
            ->join('ITEM_LIST IL', 'IOL.ITEM_SEQ = IL.SEQ', 'inner');

        // DELIVERY_STATUS 컬럼이 존재하는지 확인하고 조건 추가
        $columns = $db->getFieldNames('ITEM_ORDER_LIST');
        if (in_array('DELIVERY_STATUS', $columns)) {
            $builder->where('IOL.DELIVERY_STATUS', 'DELIVERED');
        } else {
            // DELIVERY_STATUS 컬럼이 없으면 배송업체와 송장번호가 있는 것을 대상으로 함
            $builder->where('IOL.DELI_COMP !=', '')
                    ->where('IOL.DELI_NUMB !=', '')
                    ->where('IOL.DELI_COMP IS NOT NULL')
                    ->where('IOL.DELI_NUMB IS NOT NULL');
        }

        // 정산 상태 필터링 (SETTLEMENT_STATUS 컬럼이 존재하는 경우만)
        if ($settlementStatus && in_array('SETTLEMENT_STATUS', $columns)) {
            $builder->where('IOL.SETTLEMENT_STATUS', $settlementStatus);
        }

        // 사용자 타입에 따른 필터링
        if ($memberType === 'VENDOR' && !empty($companyNumber)) {
            $builder->where('IL.COMPANY_NUMBER', $companyNumber);
        } elseif ($memberType === 'INFLUENCER' && !empty($infSeq)) {
            $builder->where('IOL.INF_SEQ', $infSeq);
        }

        $builder->orderBy('IOL.DELIVERED_DATE', 'DESC');
        $lists = $builder->get()->getResultArray();

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

    // 벤더용 대기중 주문 목록 조회
    public function getPendingOrdersForVendor()
    {
        $db = \Config\Database::connect();
        $request = $this->request->getJSON(true);
        
        $memberType = isset($request['MEMBER_TYPE']) ? $request['MEMBER_TYPE'] : null;
        $companyNumber = isset($request['COMPANY_NUMBER']) ? $request['COMPANY_NUMBER'] : null;
        
        if ($memberType !== 'VENDOR' || empty($companyNumber)) {
            return $this->respond([], 200);
        }
        
        // 벤더의 제품에 대한 대기중 주문만 조회
        $builder = $db->table('ITEM_ORDER_LIST IOL')
            ->select('IOL.*, IL.NAME as ITEM_NAME, IL.COMPANY_NUMBER, IM.NICK_NAME')
            ->join('ITEM_LIST IL', 'IOL.ITEM_SEQ = IL.SEQ', 'inner')
            ->join('INF_MEMBER IM', 'IOL.INF_SEQ = IM.SEQ', 'left')
            ->where('IL.COMPANY_NUMBER', $companyNumber)
            ->where('IOL.DEL_YN', 'N')
            ->where('(IOL.DELI_COMP IS NULL OR IOL.DELI_COMP = "")')
            ->where('(IOL.DELI_NUMB IS NULL OR IOL.DELI_NUMB = "")')
            ->orderBy('IOL.REG_DATE', 'DESC');
            
        $lists = $builder->get()->getResultArray();
        
        return $this->respond($lists, 200);
    }

}