<?php

namespace App\Http\Controllers\API;

use App\Http\Controllers\Controller;
use App\Models\Helpers\General;
use App\Models\Subscriber;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;

class SubscriberController extends Controller
{
    public function create_subscriber(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'phone'                 =>  'required|string',
            'status'                =>  'required|string',
            'subscription_date'     =>  'required|date',
            'payment_status'        =>  'required|string',
            'subscription_expiry'   =>  'required|date'
        ]);

        if ($validator->fails()) {
            return response()->json([
                'code'  =>  1000,
                'status' => 'failed',
                'message' => $validator->errors()->first()
            ]);
        }

        $prefixes = ['02', '05', '2332', '2335'];
        if (!General::validate_phone($prefixes, $request->phone)) {
            return response()->json([
                'code' => 1000,
                'status' => 'failed',
                'message' => 'Invalid phone number'
            ]);
        } 

        if (ucfirst(($request->status) !== 'active') || (ucfirst($request->status) !== 'opt-out')) {
            return response()->json([
                'code' => 1000,
                'status' => 'failed',
                'message' => "Subscriber status should be either 'active' OR 'opt-out'"
            ]);
        }
        else {
            $data['phone'] = $request->phone;
            $data['status'] = $request->status;
            $data['subscription_date'] = $request->subscription_date;
            $data['payment_status'] = $request->payment_status;
            $data['subscription_expiry'] = $request->subscription_expiry;
            try {
                $subscriber = Subscriber::create([
                    $data
                ]);
                return response()->json([
                    'code' => 1001,
                    'status' => 'success',
                    'message' => 'Subscriber has been stored successfully',
                    'subscriber_id' => $subscriber->id
                ]);
            } catch (\Throwable $th) {
                General::log_API_data('STORING SUBSCRIBER FROM USSD', $th->getMessage(), 'create_subscriber in API/SubscriberController');
                return response()->json([
                    'code' => 1000,
                    'success' => 'failed',
                    'message' => 'There was an error',
                ]);
            }
        }
    }


    public function edit_subscriber(Request $request, $id)
    {
        $validator = Validator::make($request->all(), [
            'status' => 'required|string',
            'phone' => 'required|string'
        ]);

        if ($validator->fails()) {
            return response()->json([
                'code' => 1000,
                'status' => 'failed',
                'message' => $validator->errors()->first()
            ]);
        }

        $prefixes = ['02', '05', '2332', '2335'];
        if (!General::validate_phone($prefixes, $request->phone)) {
            return response()->json([
                'code' => 1000,
                'status' => 'failed',
                'message' => 'Invalid phone number'
            ]);
        }

        if (ucfirst(($request->status) !== 'active') || (ucfirst($request->status) !== 'opt-out')) {
            return response()->json([
                'code' => 1000,
                'status' => 'failed',
                'message' => "Subscriber status should be either 'active' OR 'opt-out'"
            ]);
        } else {
            if (is_numeric($id)) {
                $subscriber = Subscriber::query()->where('id', $id)
                    ->where('phone', $request->phone)->first() ?? null;
                if ($subscriber !== null) {
                    $subscriber->update([
                        'status' => $request->status
                    ]);
                }
            } else {
                return response()->json([
                    'code' => 1000,
                    'status' => 'failed',
                    'message' => 'Subscriber id should be a number'
                ]);
            }
        }


        if (is_numeric($id)) {
            $subscriber = Subscriber::find($id) ?? null;
            if ($subscriber !== null) {
                $subscriber->update([
                    'status' => $request->status
                ]);
                return back()->with('success', 'Subscriber has been updated successfully');
            } else {
                return back()->with('error', 'Failed to update subscriber information');
            }
        } else {
            return back()->with('error', 'Subscriber id should be a number');
        }
    }
}
