<?php

namespace Shm\ShmIntegrations\TBankNominal\TBankCollections;

use Shm\Collection\Collection;
use Shm\Shm;
use Shm\ShmTypes\StructureType;
use Shm\ShmUtils\MaterialIcons;

class TNominalCompanies extends Collection
{


    public static function editableFields(): array
    {
        return [
            "type" => Shm::enum([
                'IP_RESIDENT' => "Индивидуальный предприниматель",
                'UL_RESIDENT' => "Юридическое лицо",
            ])->title("Тип компании")->editable()->inAdmin()->required(),

            "ipResident" => Shm::structure([
                //   "type" => Shm::static("IP_RESIDENT"),
                "firstName" => Shm::string()->title("Имя")->setCol(8),
                "middleName" => Shm::string()->title("Отчество")->setCol(8),
                "lastName" => Shm::string()->title("Фамилия")->setCol(8),
                "birthDate" => Shm::unixdate()->title("Дата рождения"),
                "birthPlace" => Shm::string()->title("Место рождения"),
                "citizenship" => Shm::string()->title("Гражданство"),
                "phoneNumber" => Shm::phone()->title("Телефон"),
                "email" => Shm::email()->title("Email"),
                "passport" => Shm::structure([
                    "serial" => Shm::string()->title("Серия"),
                    "number" => Shm::string()->title("Номер"),
                    "date" => Shm::unixdate()->title("Дата выдачи"),
                    "organization" => Shm::string()->title("Кем выдан"),
                    "divisionCode" => Shm::string()->title("Код подразделения"),
                ])->title("Паспорт")->editable(),
                "registrationDate" => Shm::unixdate()->title("Дата регистрации ИП"),
                "registrationAddress" => Shm::string()->title("Адрес регистрации"),
                'inn' => Shm::string()->title("ИНН"),
                "snils" => Shm::string()->title("СНИЛС"),
            ])->cond(Shm::cond()->equals("type", "IP_RESIDENT"))->title("ИП")->editable()->inAdmin()->required(),
            "ulResident" => Shm::structure([
                //    "type" => Shm::static("UL_RESIDENT"),
                "name" => Shm::string()->title("Наименование юридического лица"),
                "phoneNumber" => Shm::phone()->title("Телефон"),
                "email" => Shm::email()->title("Email"),

                //LEGAL_ENTITY_ADDRESS
                "legalEntityAddress" => Shm::string()->title("Адрес юридического лица"),
                //POSTAL_ADDRESS
                "postalAddress" => Shm::string()->title("Почтовый адрес"),
                'registrationDate' => Shm::unixdate()->title("Дата регистрации юридического лица"),
                'opf' => Shm::enum([
                    "АО" => "Акционерное общество",
                    "ООО" => "Общество с ограниченной ответственностью",
                    "ПАО" => "Публичное акционерное общество",

                ])->title("Тип юридического лица"),
                "inn" => Shm::string()->title("ИНН"),
                "ogrn" => Shm::string()->title("ОГРН"),
            ])->cond(Shm::cond()->equals("type", "UL_RESIDENT"))->title("Юр.лицо")->editable()->inAdmin()->required(),



        ];
    }

    public function schema(): StructureType
    {
        $schema = Shm::structure([

            'status' => Shm::enum([
                "draft" => "Черновик",
                "pending" => "Ожидает проверки",
                "approved" => "Одобрен",
                "rejected" => "Отклонен",
            ])->title("Статус")->default("draft")->inAdmin(),

            ...self::editableFields(),



            'scoring' => Shm::structure([
                "status" => Shm::enum([
                    'FAILED' => 'Отклонен',
                    'SUCCESS' => 'Одобрен',
                    'PENDING' => 'Ожидает проверки',
                ])->title("Статус проверки"),
                "warnings" => Shm::arrayOf(Shm::structure([
                    "code" => Shm::string()->title("Код предупреждения"),
                    "description" => Shm::string()->title("Описание предупреждения"),
                ]))->title("Предупреждения"),
                "errors" => Shm::arrayOf(Shm::structure([
                    "code" => Shm::string()->title("Код ошибки"),
                    "description" => Shm::string()->title("Описание ошибки"),
                ]))->title("Ошибки"),
            ])->title("Проверка в финансовом мониторинге"),


            "owner" => Shm::ID(),
            "ownerCollection" => Shm::string(),

        ]);

        $schema->icon(MaterialIcons::AccountBoxMultipleOutline());
        $schema->title("Юридические лица");
        $schema->canCreate()->canUpdate()->canDelete();


        return $schema;
    }

    private  static function assertCompanyFieldFilled(mixed $value, string $message): void
    {
        if ($value === null) {
            Shm::error($message);
        }
        if (is_string($value) && trim($value) === '') {
            Shm::error($message);
        }
        if (is_int($value) && $value === 0) {
            Shm::error($message);
        }
    }


    private   static function validateCompanyIpResident($data): void
    {
        self::assertCompanyFieldFilled(
            $data['firstName'],
            "Не указано имя"
        );
        self::assertCompanyFieldFilled(
            $data['middleName'],
            "Не указано отчество"
        );
        self::assertCompanyFieldFilled(
            $data['lastName'],
            "Не указана фамилия"
        );
        self::assertCompanyFieldFilled(
            $data['birthDate'],
            "Не указана дата рождения"
        );
        self::assertCompanyFieldFilled(
            $data['birthPlace'],
            "Не указано место рождения"
        );
        self::assertCompanyFieldFilled(
            $data['citizenship'],
            "Не указано гражданство"
        );
        self::assertCompanyFieldFilled(
            $data['phoneNumber'],
            "Не указан телефон"
        );
        self::assertCompanyFieldFilled(
            $data['email'],
            "Не указан email"
        );

        $passport = $data['passport'];
        if (!is_array($passport)) {
            Shm::error("Не заполнены паспортные данные");
        }
        self::assertCompanyFieldFilled($passport['serial'] ?? null, "Не указана серия паспорта");
        self::assertCompanyFieldFilled($passport['number'] ?? null, "Не указан номер паспорта");
        self::assertCompanyFieldFilled($passport['date'] ?? null, "Не указана дата выдачи паспорта");
        self::assertCompanyFieldFilled($passport['organization'] ?? null, "Не указано, кем выдан паспорт");
        self::assertCompanyFieldFilled($passport['divisionCode'] ?? null, "Не указан код подразделения паспорта");

        self::assertCompanyFieldFilled(
            $data['registrationDate'],
            "Не указана дата регистрации ИП"
        );
        self::assertCompanyFieldFilled(
            $data['registrationAddress'],
            "Не указан адрес регистрации"
        );
        self::assertCompanyFieldFilled(
            $data['inn'],
            "Не указан ИНН"
        );
        self::assertCompanyFieldFilled(
            $data['snils'],
            "Не указан СНИЛС"
        );
    }

    private static function validateCompanyUlResident($data): void
    {
        self::assertCompanyFieldFilled(
            $data['name'],
            "Не указано наименование юридического лица"
        );
        self::assertCompanyFieldFilled(
            $data['phoneNumber'],
            "Не указан телефон"
        );
        self::assertCompanyFieldFilled(
            $data['email'],
            "Не указан email"
        );
        self::assertCompanyFieldFilled(
            $data['legalEntityAddress'],
            "Не указан адрес юридического лица"
        );
        self::assertCompanyFieldFilled(
            $data['postalAddress'],
            "Не указан почтовый адрес"
        );
        self::assertCompanyFieldFilled(
            $data['registrationDate'],
            "Не указана дата регистрации юридического лица"
        );
        self::assertCompanyFieldFilled(
            $data['opf'],
            "Не указан тип юридического лица (ОПФ)"
        );
        self::assertCompanyFieldFilled(
            $data['inn'],
            "Не указан ИНН"
        );
        self::assertCompanyFieldFilled(
            $data['ogrn'],
            "Не указан ОГРН"
        );
    }

    /**
     * На вход принимается массив данных компании и проверяется на валидность
     * то есть заполнены ли поля 
     */
    public static function validateCompany($data): void
    {



        $type = $data['type'];

        if (!$type) {
            Shm::error("Тип компании не указан");
        }
        if ($type === 'IP_RESIDENT') {
            self::validateCompanyIpResident($data['ipResident']);
        } elseif ($type === 'UL_RESIDENT') {
            self::validateCompanyUlResident($data['ulResident']);
        } else {
            Shm::error("Неизвестный тип компании");
        }
    }
}