<?php
class MHP_DLBox_Core {

    public static function process_series($post_id, $base_url) {
        $series_dlbox = get_post_meta($post_id, 'series_dlbox', true) ?: [];
        $series_playlinks = get_post_meta($post_id, 'series_playlinks', true) ?: [];

        $roots = [
            'sub' => ['Soft.Sub', 'Softsub'],
            'dub' => ['Dubbed'],
        ];

        foreach ($roots as $type => $folders) {
            foreach ($folders as $root) {
                for ($s = 1; $s <= 30; $s++) {
                    $season_url = trailingslashit($base_url . $root . "/S" . str_pad($s, 2, '0', STR_PAD_LEFT) . "/");
                    $subs = [];
                    if ($type === 'sub') {
                        foreach (self::get_links_from_folder($season_url . 'Sub/') as $sf)
                            if (preg_match('/S\d+E(\d+)/i', $sf, $m))
                                $subs[(int)$m[1]] = $sf;
                    }
                    foreach (self::get_subfolders($season_url) as $qfolder) {
                        $quality = self::parse_quality($qfolder);
                        $is_x265 = self::is_x265($quality);
                        $qurl = trailingslashit($season_url . $qfolder);
                        foreach (self::get_links_from_folder($qurl) as $vf) {
                            if (!preg_match('/S\d+E(\d+)/i', $vf, $m)) continue;
                            $ep = (int)$m[1];
                            self::add_or_update_dlbox_item($series_dlbox, $s, $type, $ep, $vf, $quality);
                            if (!$is_x265) {
                                $sub = ($type === 'sub' && isset($subs[$ep])) ? $subs[$ep] : '';
                                self::add_or_update_playlink_item($series_playlinks, $s, $type, $ep, $vf, $quality, $sub);
                            }
                        }
                    }
                }
            }
        }

        update_post_meta($post_id, 'series_dlbox', $series_dlbox);
        update_post_meta($post_id, 'series_playlinks', $series_playlinks);
        return true;
    }

    private static function get_links_from_folder($url) {
        $res = wp_remote_get($url, ['timeout' => 10]);
        if (is_wp_error($res)) return [];
        preg_match_all('/href="([^"]+)"/i', wp_remote_retrieve_body($res), $m);
        $out = [];
        foreach ($m[1] as $f) {
            if (preg_match('/\.(mp4|mkv|srt)$/i', $f)) {
                if (!filter_var($f, FILTER_VALIDATE_URL))
                    $f = trailingslashit($url) . ltrim($f, '/');
                $out[] = $f;
            }
        }
        return array_unique($out);
    }

    private static function get_subfolders($url) {
        $res = wp_remote_get($url, ['timeout' => 10]);
        if (is_wp_error($res)) return [];
        preg_match_all('/href="([^"]*\/?)"/i', wp_remote_retrieve_body($res), $m);
        $dirs = [];
        foreach ($m[1] as $d) {
            if (substr($d, -1) === '/' && stripos($d, 'sub') === false) {
                $dirs[] = rtrim($d, '/');
            }
        }
        return array_unique($dirs);
    }

    private static function parse_quality($folder) {
        $f = strtolower($folder);
        $res = '';
        $extra = [];
        if (strpos($f, '2160') !== false) $res = '2160p';
        elseif (strpos($f, '1080') !== false) $res = '1080p';
        elseif (strpos($f, '720') !== false) $res = '720p';
        elseif (strpos($f, '480') !== false) $res = '480p';
        if (strpos($f, 'x265') !== false || strpos($f, 'h265') !== false) $extra[] = 'x265';
        if (strpos($f, '10bit') !== false) $extra[] = '10bit';
        if (strpos($f, 'bluray') !== false) $extra[] = 'BluRay';
        elseif (strpos($f, 'web') !== false) $extra[] = 'Web-DL';
        return trim($res . ' ' . implode(' ', $extra));
    }

    private static function is_x265($quality) {
        return stripos($quality, 'x265') !== false;
    }

    private static function add_or_update_dlbox_item(&$box, $season, $type, $ep, $url, $quality) {
        foreach ($box as &$b) {
            if ($b['name'] === "فصل $season" && $b['type'] === $type && $b['quality'] === $quality) {
                goto ADD;
            }
        }
        $box[] = [
            'name' => "فصل $season",
            'quality' => $quality,
            'count' => 0,
            'capacity' => '',
            'type' => $type,
            'subtype' => $type === 'sub' ? 'SoftSub' : '',
            'price' => '',
            'items' => []
        ];
        $b = &$box[array_key_last($box)];
    ADD:
        foreach ($b['items'] as &$i) {
            if ($i['title'] === "قسمت $ep") {
                $i['link'] = $url;
                return;
            }
        }
        $b['items'][] = [
            'title' => "قسمت $ep",
            'link' => $url,
            'subtitle' => '',
            'sound' => ''
        ];
        $b['count'] = count($b['items']);
    }

    private static function add_or_update_playlink_item(&$pl, $season, $type, $ep, $url, $quality, $sub = '') {
        foreach ($pl as &$p) {
            if ($p['season_name'] === "فصل $season" && $p['quality_link'] === $quality && $p['type_link'] === $type) {
                goto ADD;
            }
        }
        $pl[] = [
            'season_name' => "فصل $season",
            'quality_link' => $quality,
            'type_link' => $type,
            'items' => []
        ];
        $p = &$pl[array_key_last($pl)];
    ADD:
        foreach ($p['items'] as $i)
            if ($i['play_link'] === $url) return;
        $p['items'][] = [
            'episode' => $ep,
            'play_link' => $url,
            'fasub_link' => $sub,
            'ensub_link' => ''
        ];
    }
}