<?php

namespace App\Http\Controllers;

use App\Models\ProgramAppends;
use App\Models\Programs;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller as BaseController;

class ProgramAppendConstructController extends BaseController
{
    // region Views
    public function index(Request $request, Programs $program) {
        return view("program.construct.append.index", [
            "program" => $program,
            "appends" => $program->appends,
        ]);
    }

    public function add(Request $request, Programs $program) {
        $append = new ProgramAppends();
        if (sizeof($program->appends) === 0) {
            $append->is_original = 1;
        }
        return view("program.construct.append.create", [
            "program" => $program,
            "append" => $append
        ]);
    }

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

    public function copy_view(Request $request, Programs $program) {
        $programsId = Programs::query()->select("id")
            ->where("created_at", "<", $program->created_at->addWeeks(2))
            ->where("created_at", ">", $program->created_at->addWeeks(-2))
            ->pluck("id");
        $broadcastList = ProgramAppends::query()->groupBy("name", "from")
            ->whereIn("program_id", $programsId)
            ->where("broadcast", "=", 1)
            ->select("name", "from")->selectRaw("max(id) as id")
            ->orderBy("id")->get();
        return view("program.construct.append.copy_broadcast", [
            "program" => $program,
            "broadcastList" => $broadcastList,
        ]);
    }
    // endregion

    // region Form Submits
    public function create(Request $request, Programs $program) {
        $append = $this->fill_model($request);
        $program->appends()->save($append);
        return redirect(route("program.construct.append.list", [
            "program"=>$program->id,
        ]));
    }

    public function submit(Request $request, ProgramAppends $append) {
        $append = $this->fill_model($request, $append);
        $append->save();
        return redirect(route("program.construct.append.list", [
            "program"=>$append->program->id,
        ]));
    }

    public function copy_append(Request $request, Programs $program) {
        $payload = $request->validate([
            "ids" => ["required", "array", "exists:App\Models\ProgramAppends,id"]
        ]);
        $original_appends = ProgramAppends::query()->findMany($payload["ids"]);
        $appends = $original_appends->map(function ($append) {
            return $append->replicate();
        });
        $program->appends()->saveMany($appends);
        return redirect(route("program.construct.append.list", [
            "program"=>$program->id,
        ]));
    }
    // endregion

    // region API
    public function from_list(Request $request) {
        $query = ProgramAppends::query()->groupBy("from")
            ->select("from")
            ->selectRaw("count(1) as total_count")
            ->orderByDesc("total_count");
        return $query->get()->map(function ($item) {
            return [
                "text" => $item["from"],
                "value" => $item["from"],
                "alias" => implode("", \pinyin($item["from"], PINYIN_NO_TONE|PINYIN_KEEP_ENGLISH)),
                "abbr" => \pinyin_abbr($item["from"]),
            ];
        })->toArray();
    }
    // endregion

    private function fill_model(Request $request, ?ProgramAppends $append = null): ProgramAppends
    {
        if ($append === null) {
            $append = new ProgramAppends();
        }
        $payload = $request->validate([
            "name" => ["required_without:is_original"],
            "from" => ["required"],
            "price" => ["required", "numeric"],
            "append" => [],
        ]);
        $append->fill($payload);
        $append->is_original = $request->post("is_original", 0);
        return $append;
    }
}