<?php

namespace Tests\Unit;

use App\Support\MansionRoomSyncFields;
use PHPUnit\Framework\TestCase;

class MansionRoomSyncFieldsTest extends TestCase
{
    public function test_it_returns_only_the_shared_contract_and_maps_name_to_name_apartment(): void
    {
        $sharedFields = [
            'zip', 'address1', 'address2', 'address3', 'address4', 'lat', 'lng',
            'main_traffic', 'main_traffic_line', 'main_traffic_line_id', 'main_traffic_station', 'main_traffic_station_id',
            'main_traffic_time', 'main_traffic_bus_time', 'main_traffic_bus', 'main_traffic_bus_walk', 'sub_traffic1',
            'sub_traffic1_line', 'sub_traffic1_line_id', 'sub_traffic1_station', 'sub_traffic1_station_id', 'sub_traffic1_time',
            'sub_traffic1_bus_time', 'sub_traffic1_bus', 'sub_traffic1_bus_walk', 'sub_traffic2', 'sub_traffic2_line',
            'sub_traffic2_line_id', 'sub_traffic2_station', 'sub_traffic2_station_id', 'sub_traffic2_time',
            'sub_traffic2_bus_time', 'sub_traffic2_bus', 'sub_traffic2_bus_walk', 'primary_school_city', 'primary_school_school',
            'primary_school_distance', 'primary_school2_city', 'primary_school2_school', 'primary_school2_distance',
            'primary_school3_city', 'primary_school3_school', 'primary_school3_distance', 'secondary_school_city',
            'secondary_school_school', 'secondary_school_distance', 'secondary_school2_city', 'secondary_school2_school',
            'secondary_school2_distance', 'secondary_school3_city', 'secondary_school3_school', 'secondary_school3_distance',
            'total_unit', 'age_year', 'age_month', 'construction', 'construction_sub', 'floor', 'underground', 'sales_company',
            'construction_company', 'management_company', 'management_form', 'pet', 'land_right', 'use_area', 'land_use',
            'land_use2', 'city_plan', 'city_plan_reason', 'else_traffic', 'else_traffic_line', 'else_traffic_station',
            'else_traffic_time', 'else_traffic_bus_time', 'else_traffic_bus', 'else_traffic_bus_walk', 'other_address',
            'other_primary_school_1', 'other_primary_school_2', 'other_primary_school_3', 'other_secondary_school_1',
            'other_secondary_school_2', 'other_secondary_school_3',
        ];
        $approvedAdditionalFields = [
            'name_apartment', 'pet_count', 'leasehold_kind', 'leasehold_period', 'leasehold_period_year',
            'leasehold_period_month', 'leasehold_period_year1', 'leasehold_period_month1', 'right_cost', 'right_cost_val',
            'deposit_cost', 'deposit_cost_val', 'security_deposit_cost', 'security_deposit_cost_val', 'other_leasehold',
            'land_area_val', 'kokudoho', 'gas', 'move_in_conditions',
        ];
        $contractFields = array_merge($sharedFields, $approvedAdditionalFields);
        $payload = array_combine(
            $contractFields,
            array_map(static function (string $field): string {
                return 'value-for-' . $field;
            }, $contractFields)
        );
        $payload = array_merge($payload, [
            'name' => 'Mansion A',
            'gas' => null,
            'move_in_conditions' => '',
            'property_sub' => 'room-only',
            'property' => 6,
            'memo1' => 'internal memo',
            'memo2' => 'internal memo',
            'build_note' => 'building note',
            'comment' => 'room comment',
            'id' => 1,
            'building_id' => 2,
            'mansion_id' => 3,
            'company_id' => 4,
        ]);

        $result = MansionRoomSyncFields::fromPayload($payload);

        $expected = array_combine(
            $contractFields,
            array_map(static function (string $field): string {
                return 'value-for-' . $field;
            }, $contractFields)
        );
        $expected['name_apartment'] = 'Mansion A';
        $expected['gas'] = null;
        $expected['move_in_conditions'] = '';

        $this->assertSame($expected, $result);
        $this->assertArrayNotHasKey('name', $result);
        foreach (['property_sub', 'property', 'memo1', 'memo2', 'build_note', 'comment', 'id', 'building_id', 'mansion_id', 'company_id'] as $excludedField) {
            $this->assertArrayNotHasKey($excludedField, $result);
        }
    }
}
