<?php

namespace App\Http\Controllers;

use App\Models\Programs;
use App\Models\ProgramVideos;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Storage;

class ProgramVideoConstructController extends BaseController
{
    public function index(Request $request, Programs $program) {
        return view("program.construct.video.index", [
            "program" => $program,
            "videos" => $program->video_pivots,
        ]);
    }

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

    public function create(Request $request, Programs $program) {
        $request->validate([
            "video_bvid" => ["required"],
            "start_part" => ["required", "int"],
            "stop_part" => ["required", "int"],
            "start_time" => ["required", "date_format:H:i:s"],
            "stop_time" => ["required", "date_format:H:i:s"],
            "created_at" => ["required", "date"],
        ]);
        $program_video = new ProgramVideos();
        $createPayload = $request->only(["start_part", "start_time", "stop_part", "stop_time"]);
        $program_video->fill($createPayload);
        $program_video->video_bvid = $request->post("video_bvid");
        if ($request->hasFile("start_image")) {
            $file = $request->file("start_image");
            $path = $file->store("lubo_file");
            $full_path = Storage::url($path);
//            $program_video->start_image = str_replace("jerryyan.top", "jerryyan.net", $full_path);
            $program_video->start_image = $full_path;
        }
        if ($request->hasFile("stop_image")) {
            $file = $request->file("stop_image");
            $path = $file->store("lubo_file");
            $full_path = Storage::url($path);
//            $program_video->stop_image = str_replace("jerryyan.top", "jerryyan.net", $full_path);
            $program_video->stop_image = $full_path;
        }
        $program_video->created_at = $request->post("created_at");
        $program->video_pivots()->save($program_video);
        return redirect(route("program.construct.video.list", [
            "program"=>$program_video->program_id
        ]));
    }

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

    public function submit(Request $request, ProgramVideos $program_video) {
        $request->validate([
            "start_part" => ["required", "int"],
            "stop_part" => ["required", "int"],
            "start_time" => ["required", "date_format:H:i:s"],
            "stop_time" => ["required", "date_format:H:i:s"],
            "created_at" => ["required", "date"],
        ]);
        $updatePayload = $request->only(["start_part", "start_time", "stop_part", "stop_time"]);
        if ($request->hasFile("start_image")) {
            $file = $request->file("start_image");
            $path = $file->store("lubo_file");
            $full_path = Storage::url($path);
//            $program_video->start_image = str_replace("jerryyan.top", "jerryyan.net", $full_path);
            $program_video->start_image = $full_path;
        }
        if ($request->hasFile("stop_image")) {
            $file = $request->file("stop_image");
            $path = $file->store("lubo_file");
            $full_path = Storage::url($path);
//            $program_video->stop_image = str_replace("jerryyan.top", "jerryyan.net", $full_path);
            $program_video->stop_image = $full_path;
        }
        $program_video->created_at = $request->post("created_at");
        $program_video->update($updatePayload);
        /**
         * @var $program Programs
         */
        $program = $program_video->program;
        $program->created_at = $program->video_pivots()->first()->created_at;
        $program->save();
        return redirect(route("program.construct.video.list", [
            "program"=>$program_video->program_id
        ]));
    }

    public function to_fix_created_at(Request $request, ProgramVideos $program_video) {
        if ($program_video->created_at === null) {
            return back()->withErrors([
                "id" => "没有开始时间,请先保存对应时间"
            ]);
        }
        return view("program.construct.video.time_fix", [
            "program_video" => $program_video
        ]);
    }

    public function fix_created_at_base_on(Request $request, ProgramVideos $program_video)
    {
        $request->validate([
            "each_time" => ["required", "date_format:H:i:s"]
        ]);
        if ($program_video->created_at === null) {
            return back()->withErrors([
                "id" => "没有开始时间,请先保存对应时间"
            ]);
        }
        $each_time = $request->post("each_time");
        $each_time_sec = Carbon::createFromFormat("H:i:s", $each_time)->secondsSinceMidnight();
        /**
         * @var $program_videos ProgramVideos[]
         */
        $program_videos = ProgramVideos::query()
            ->where("video_bvid", "=", $program_video->video_bvid)
            ->where("id", "!=", $program_video->id)
            ->where(function (Builder $query) use ($program_video) {
                $query->where("created_at", ">", $program_video->created_at)->orWhere("created_at", "=", null);
            })
            ->get();
        /**
         * @var $created_at Carbon
         */
        $created_at = $program_video->created_at;
        $base_time = $created_at->subSeconds($program_video->start_sec)->subSeconds(($program_video->start_part - 1) * $each_time_sec);
        foreach ($program_videos as $video) {
            if ($video->id === $program_video->id) {
                continue;
            }
            $time = $base_time->copy()->addSeconds(($video->start_part - 1) * $each_time_sec)->addSeconds($video->start_sec);
            if ($time->second > 30) {
                $time->addMinute();
            }
            $time->seconds(0);
            $video->created_at = $time;
            $video->update();
        }
        return redirect(route("program.construct.list"));
    }
}