<?php

class WilayahService {
    const SRC_DAGRI = "DAGRI";
    const SRC_DB = "DB";
    const DIFF_CODE = "CODE";
    const DIFF_NAME = "NAME";

    public static function sanitizeCode($code) {
        return str_replace(".", "", $code);
    }

    public static function sanitizeName($name) {
        return str_replace(" ", "", strtolower($name));
    }

    /**
     * @param $dataDB
     * @param $dataDagri
     * @return array of DB Provinsi objects
     */
    public static function compareProvinsiDBWithDagri($dataDB, $dataDagri): array
    {
        $dataKeyValues = self::arrayToCodeNameKeyValues($dataDagri, 'kode_provinsi', 'nama_provinsi');

        return self::compareCodeName(
            $dataDB,
            self::SRC_DB,
            "provinsi_code",
            "provinsi_name",
            $dataKeyValues["code"],
            $dataKeyValues["name"]
        );
    }

    /**
     * @param $dataDagri
     * @param $dataDB
     * @return array of Dagri Provinsi objects
     */
    public static function compareProvinsiDagriWithDB($dataDagri, $dataDB): array
    {
        $dataKeyValues = self::arrayToCodeNameKeyValues($dataDB, 'provinsi_code', 'provinsi_name');

        return self::compareCodeName(
            $dataDagri,
            self::SRC_DAGRI,
            "kode_provinsi",
            "nama_provinsi",
            $dataKeyValues["code"],
            $dataKeyValues["name"]
        );
    }

    /**
     * @param $dataDB
     * @param $dataDagri
     * @return array of DB KabKota objects
     */
    public static function compareKabKotaDBWithDagri($dataDB, $dataDagri): array
    {
        $dataKeyValues = self::arrayToCodeNameKeyValues($dataDagri, 'kode_kabkota', 'nama_kabkota');

        return self::compareCodeName(
            $dataDB,
            self::SRC_DB,
            "kota_kabupaten_code",
            "kota_kabupaten_name",
            $dataKeyValues["code"],
            $dataKeyValues["name"]
        );
    }

    /**
     * @param $dataDagri
     * @param $dataDB
     * @return array of Dagri KabKota objects
     */
    public static function compareKabKotaDagriWithDB($dataDagri, $dataDB): array
    {
        $dataKeyValues = self::arrayToCodeNameKeyValues($dataDB, 'kota_kabupaten_code', 'kota_kabupaten_name');

        return self::compareCodeName(
            $dataDagri,
            self::SRC_DAGRI,
            "kode_kabkota",
            "nama_kabkota",
            $dataKeyValues["code"],
            $dataKeyValues["name"]
        );
    }

    public static function compareCodeName($dataSource, $source, $sourceCodeKey, $sourceNameKey, $targetByCode, $targetByName): array
    {
        $result = [];
        foreach($dataSource as $item) {
            if (!array_key_exists(self::sanitizeCode($item[$sourceCodeKey]), $targetByCode)) {
                $item['diff'] = self::DIFF_CODE;
                $item['src'] = $source;
                $result[] = $item;
            } elseif (!array_key_exists(self::sanitizeName($item[$sourceNameKey]), $targetByName)) {
                $item['diff'] = self::DIFF_NAME;
                $item['src'] = $source;
                $result[] = $item;
            }
        }

        return ArrayHelper::sortByKey($result, $sourceCodeKey);
    }

    public static function arrayToCodeNameKeyValues($array, $codeKey, $nameKey): array
    {
        $result = [
            'code' => [],
            'name' => []
        ];

        $keyValues = array_column($array, $nameKey, $codeKey);
        foreach ($keyValues as $key => $value) {
            $result['code'][self::sanitizeCode($key)] = $value;
        }

        $keyValues = array_column($array, $codeKey, $nameKey);
        foreach ($keyValues as $key => $value) {
            $result['name'][self::sanitizeName($key)] = $value;
        }

        return $result;
    }
}
