<?php

namespace App\Http\Controllers;

use App\Models\Programs;
use App\Models\ProgramVideos;
use App\Models\VideoComments;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller as BaseController;

class ProgramConstructController extends BaseController
{
    public function index(Request $request) {
        $status = $request->get("status", "0");
        $query = Programs::query()->with(["appends", "video_pivots.video"])->where("status", $status, 0)->orderByDesc("created_at");
        $programs = $query->paginate(10)->withQueryString();;
        return view("program.construct.index", [
            "programs"=>$programs,
        ]);
    }

    public function add(Request $request) {
        return view("program.construct.create", [
            "program"=>new Programs()
        ]);
    }

    public function create(Request $request) {
        $request->validate([
            "name" => ["required"]
        ]);
        $program = new Programs();
        $createPayload = $request->only(["name", "difficulty", "desc"]);
        $program->fill($createPayload);
        $program->status = $request->post("status", 0);
        $program->save();
        return redirect(route("program.construct.edit", ["program"=>$program->id]));
    }

    public function from_comment(Request $request, VideoComments $comment) {
        return redirect(route("program.construct.batch_add"))->withInput([
            "bvid"=>$comment->video->bvid,
            "content"=>$comment->content
        ]);
    }

    public function batch_add(Request $request) {
        return view("program.construct.batch_add");
    }

    public function batch_create(Request $request) {
        $request->validate([
            'bvid' => ['required'],
            'content' => ['required'],
        ]);
        $bvid = $request->post("bvid");
        $content = $request->post("content");
        $count = ProgramVideos::query()->where("video_bvid", "=", $bvid)->count();
        if ($count > 0) {
            return view("program.construct.batch_add", [
                "content" => $content,
                "bvid" => $bvid,
                "message" => "该BVID下已有{$count}个节目关联,请手动添加",
            ]);
        }
        $regex = "/^p(?P<part>\d{1,2})[-# _:,)]+(?P<time>(0?1[::])?(\d{1,3}[::])\d{1,2})?[ :]?(?P<content>.+)$/i";
        foreach (explode("\n", $content) as $line) {
            $match = [];
            $match_count = preg_match($regex, $line, $match);
            if ($match_count > 0) {
                $time = $match["time"];
                $time = str_replace(":", ":", $time);
                while (substr_count($time, ":") < 2) {
                    $time = "0:".$time;
                }
                $program = new Programs();
                $program->name = $match["content"];
                $video_pivot = new ProgramVideos();
                $video_pivot->video_bvid = $bvid;
                $video_pivot->start_part = $match["part"];
                $video_pivot->start_time = $time;
                $video_pivot->stop_part = $match["part"];
                $program->save();
                $program->video_pivots()->save($video_pivot);
            }
        }
        return redirect(route("program.construct.list"));
    }

    public function edit(Request $request, Programs $program) {
        return view("program.construct.create", [
            "program"=>$program
        ]);
    }

    public function submit(Request $request, Programs $program) {
        $request->validate([
            "name" => ["required"]
        ]);
        $updatePayload = $request->only(["name", "difficulty", "desc"]);
        $program->status = $request->post("status", 0);
        $program->update($updatePayload);
        return view("program.construct.create", [
            "program"=>$program
        ]);
    }
}