<?php

namespace App\Console\Commands\Converters;

use App\Models\MstCity;
use App\Models\MstPropertyType;
use App\Models\MstTown;
use App\Models\RelationCustomContent;

class SaiKyotoContructConverter
{
    public static function convert($data, $room = null) : array
    {
        if (! is_null($room)) {
            $data["name"] = $room["name"];
            $data["room_num"] = $room["room_num"];
            $data["price"] = $room["price"];
            $data["building_id"] = $room["building_id"];
            $data["company_manner"] = $room["company_manner"];
            $data["total_area_val"] = $room["total_area_val"];
            $data["whereabouts"] = $room["whereabouts"];
            $data["status"] = $room["status"];
            $data["place_area"] = $room["place_area"];
            $data["balcony_direction"] = $room["balcony_direction"];
        }
        $dataForSaiKyoto = [];
        $dataForSaiKyoto["c_name"] = "{$data['name']} {$data["name_gouchi"]}";
        $dataForSaiKyoto["c_city"] = isset($data['address2']) ? MstCity::getName($data['address1'], $data['address2'])['name'] : "";
        $dataForSaiKyoto["c_town"] = isset($data['address3']) ? MstTown::getName($data['address1'], $data['address2'], $data['address3'])['name'] : "";
        $dataForSaiKyoto["c_bunrui"] = self::getBunrui(static::findElementByKeyValue( MstPropertyType::getData($data['property']), 'code', $data['property'], 'name'));
        $dataForSaiKyoto["c_kakaku"] = $data["price"];
        $dataForSaiKyoto["c_tatemen"] = self::getTatemen($data);
        $dataForSaiKyoto["c_senmen"] = self::getTatemen($data, true);
        $dataForSaiKyoto["c_tochitsubo"] = static::roundFl($data['land_area_val'] * 0.3025);
        $dataForSaiKyoto["c_tochimen"] = $data["land_area_val"];

        if (isset($data['age_month']) && strlen($data['age_month']) == 1) {
            $data["age_month"] = " {$data["age_month"]}";
        }
        $dataForSaiKyoto['c_chiku'] = (isset($data['age_year']) && $data['age_month']) ? ($data['age_year'] . "/" . $data['age_month']) : "";

        $isLandArticle = in_array($data['property'], [1, 2, 3]);
        $dataForSaiKyoto['c_shinchiku'] = $data['property_sub'] == 2 ? "中古" : "新築";
        if ($isLandArticle)
            $dataForSaiKyoto['c_shinchiku'] = "";

        $dataForSaiKyoto["c_kaibubun"] = $data["whereabouts"];
        $dataForSaiKyoto["c_setsudo3"] = self::getLand($data, 3);
        $dataForSaiKyoto["c_setsudo2"] = self::getLand($data, 2);
        $dataForSaiKyoto["c_setsudo1"] = self::getLand($data, 1);
        $dataForSaiKyoto["c_traffic1"] = self::getMainTraffic($data);
        $dataForSaiKyoto["c_traffic2"] = self::getSubTraffic($data, 1);
        $dataForSaiKyoto["c_traffic3"] = self::getSubTraffic($data, 2);
        $dataForSaiKyoto["c_st3"] = $data["sub_traffic2_line"] . $data["sub_traffic2_station"];
        $dataForSaiKyoto["c_st2"] = $data["sub_traffic1_line"] . $data["sub_traffic1_station"];
        $dataForSaiKyoto["c_st1"] = $data["main_traffic_line"] . $data["main_traffic_station"];
        $dataForSaiKyoto["c_toho3"] = $data["sub_traffic2_time"];
        $dataForSaiKyoto["c_toho2"] = $data["sub_traffic1_time"];
        $dataForSaiKyoto["c_toho1"] = $data["main_traffic_time"];
        $dataForSaiKyoto["c_bukkenkubun"] = self::getStatus($data["status"]);
        $dataForSaiKyoto["c_jitakubun"] = $data["original_add"] ?? '';
        $dataForSaiKyoto["c_id"] = $data["building_id"];
        $dataForSaiKyoto["c_area"] = $data['place_area'] ?? "";
        $dataForSaiKyoto["c_chiku_age"] = self::getAgeData($data, true);
        $dataForSaiKyoto["c_chiku_sute"] = self::getAgeData($data, false);
        $dataForSaiKyoto["c_muki"] = self::getBalconyDirection($data["balcony_direction"] ?? "");
        $dataForSaiKyoto["c_reform_kako"] = self::getCustomField($data, 5);
        $dataForSaiKyoto["c_reform_hanbai"] = self::getCustomField($data, 4);
        $dataForSaiKyoto["c_seiyaku"] = $data["close_date"];

        return $dataForSaiKyoto;
    }

    private static function getCustomField($article, $code)
    {
        $field = RelationCustomContent::where("article_id", $article["building_id"] ?? "")
            ->where("code", $code)
            ->first();

        return optional($field)->contents;
    }

    private static function getBalconyDirection($value)
    {
        $direction = [
            1 => "北",
            2 => "北東",
            3 => "東",
            4 => "南東",
            5 => "南",
            6 => "南西",
            7 => "西",
            8 => "北西",
        ];

        return $direction[$value] ?? "";
    }

    private static function getAgeData($article, $year = false)
    {
        $allowProperty = [1,2,3,4,5];
        if (in_array($article["property"] ?? 0, $allowProperty)) {
            if ($article["property_sub"] != 2) return "";
        }

        try {
            $now = \Carbon\Carbon::now();
            $ageYear = trim($article["age_year"]);
            $ageMonth = trim($article["age_month"]);
            $dateAge = "{$ageYear}-{$ageMonth}-01";
            $target = \Carbon\Carbon::parse($dateAge);
            $month = $now->diffInMonths($target);
            $yearAge = intval($month / 12);
            $monthAge = $month % 12;

            if ($monthAge > 0)
                $yearAge = $yearAge + 1;

            if ($year)
                return $yearAge;

            return $monthAge;
        } catch (\Error $error) {
            return "";
        } catch (\Exception $error) {
            return "";
        }
    }

    private static function getBunrui($value)
    {
        if ($value == "戸建") return "一戸建て";
        if ($value == "テラスハウス") return "一戸建て";

        return $value;
    }

    private static function getTatemen($article, $isMansion = false)
    {
        $property = $article["property"] ?? "";
        $landProperty = [1,2,3];
        $mansionProperty = [6,7];
        if ($isMansion) {
            if (in_array($property, $mansionProperty)) {
                return $article["total_area_val"] ?? 0;
            } else {
                return 0;
            }
        }

        if (empty($property)) return 0;
        if (in_array($property, $landProperty)) return 0;

        return $article["total_area_val"] ?? 0;
    }

    private static function getPlaceArea($value)
    {
        if ($value == "安朱（＋上野）") return "安朱";
        if ($value == "小山（＋髭茶屋＋八軒屋敷）") return "小山";
        if ($value == "藤尾（大津市）") return "藤尾";
        if ($value == "醍醐（＋小栗栖）") return "醍醐";

        return $value;
    }

    public static function getStatus($value)
    {
        if ($value == 4 || $value == 5) {
            return "成約";
        }

        return "飛ばさない";
    }

    public static function findElementByKeyValue($array, $keySearch = "", $value, $keyGet = "")
    {
        $results = "";
        $key = array_search($value, array_column($array, $keySearch));
        if ($key !== false) {
            $results = $array[$key][$keyGet];
        }
        return $results;
    }

    public static function getLand($data, $index)
    {
        $kind = self::getLandKind($data["land_kind{$index}"] ?? "");
        $direction = self::getLandDirection($data["land_direction{$index}"] ?? "");
        $width = $data["road_width{$index}"] ?? "";
        $frontage = $data["frontage{$index}"] ?? "";

        if (!empty($kind) && !empty($direction)) {
            $extension = "";
            if (!empty($width)) {
                $extension .= "幅員{$width}m";
            }
            if (!empty($frontage)) {
                $extension .= "間口{$frontage}m";
            }
            return "{$direction}側{$kind} {$extension}";
        }
    }

    private static function getLandDirection($direction)
    {
        $directions = [
            1 => "北",
            2 => "北東",
            3 => "東",
            4 => "南東",
            5 => "南",
            6 => "南西",
            7 => "西",
            8 => "北西"
        ];

        return $directions[$direction] ?? "";
    }

    private static function getLandKind($value)
    {
        $kind = [
            1 => "公道",
            2 => "私道"
        ];

        return $kind[$value] ?? "";
    }

    public static function getMainTraffic($data)
    {
        $traffic = $data["main_traffic"] ?? "";
        if ($traffic == 1) {
            return $data['main_traffic_line'] . $data['main_traffic_station'] . 'から徒歩' . $data['main_traffic_time'] . '分';
        }

        return $data['main_traffic_line'] . $data['main_traffic_station'] . 'からバス' . $data['main_traffic_bus_time'] . '分' . $data['main_traffic_bus'] .'停歩' . $data['main_traffic_bus_walk'] . '分';
    }

    public static function getSubTraffic($data, $index)
    {
        $traffic = $data["sub_traffic{$index}"];
        $line = $data["sub_traffic{$index}_line"];
        $station = $data["sub_traffic{$index}_station"];
        $time = $data["sub_traffic{$index}_time"];
        $busTime = $data["sub_traffic{$index}_bus_time"];
        $bus = $data["sub_traffic{$index}_bus"];
        $walk = $data["sub_traffic{$index}_bus_walk"];

        if (
            empty($traffic) && empty($line) && empty($station) &&
            empty($time) && empty($busTime) && empty($bus) && empty($walk)
        ) {
            return "から徒歩分";
        }

        if ($traffic == 1) {
            return $line . $station . 'から徒歩' . $time . '分';
        }

        return $line . $station . 'からバス' . $busTime . '分' . $bus .'停歩' . $walk . '分';
    }

    private static function roundFl($number)
    {
        return floor($number * 100) / 100;
    }

    private static function getGDData($value)
    {
        $gb = [
            1 => "常駐",
            2 => "通勤",
            3 => "巡回",
            4 => "勤務形態未定"
        ];

        return $gb[$value] ?? "-";
    }

    private static function getGOData($value)
    {
        $gb = [
            0 => "-",
            5 => "自主管理"
        ];

        return $gb[$value] ?? "委託";
    }
}
