/* Yeni Obyekt / Redaktə — Inspector-un obyekt yaratma-redaktə prosesinin birebir
   ekvivalenti (openObjectSaveModal + saveObjectFromPopup məntiqi):
   - "Növ" radio: Obyekt HƏMİŞƏ disable; kind yalnız Fərdi ev/Qanunsuz və ya
     təyinat seçimi (17=Fərdi, 16=Qanunsuz) ilə dəyişir.
   - Redaktə rejimində Növ tamamilə disable olur.
   - Validasiya mesajları/sırası Inspector ilə eynidir. */
Vue.component('new-object-view', {
    props: { params: Object },
    data: function () {
        var L = window.MOCK.lookups;
        return {
            PRIVATE_DEST: 17, ILLEGAL_DEST: 16, UNKNOWN_CUSTOMER: 75,
            saving: false, loading: false,
            lk: { districts: L.districts, destinations: L.destinations, financeSources: L.financeSources, registrationTypes: L.registrationTypes },
            iamasActive: true,
            kind: 'object',                 // 'object' | 'private' | 'illegal'
            destinationLocked: false,
            m: {
                objectName: '', districtId: '', address: '', destinationId: '',
                financeSourceId: '', contractorName: '', registrationTypeId: '',
                startDate: '', endDate: '',
                workPurpose1: false, workPurpose2: false, workPurpose3: false,
                workPurpose4: false, workPurpose5: false, workPurpose6: false,
                isCoastal: false, isLiberatedArea: false
            },
            applicant: this.newParty(),     // Sifarişçi
            customer: this.newParty(),      // Sahib
            workPurposes: [
                ['workPurpose1', 'Əsaslı tikinti'], ['workPurpose2', 'Bərpa-gücləndirmə'],
                ['workPurpose3', 'Cari təmir'], ['workPurpose4', 'Əsaslı təmir'],
                ['workPurpose5', 'Söküntü işləri'], ['workPurpose6', 'Yenidənqurma']
            ],
            partyKinds: [{ id: 'state', name: 'Dövlət' }, { id: 'legal', name: 'Hüquqi' }, { id: 'physical', name: 'Fiziki' }]
        };
    },
    computed: {
        editMode: function () { return !!(this.params && this.params.id); }
    },
    watch: {
        kind: function (k) { this.applyKindRules(k); },
        'm.destinationId': function (id) {
            if (this._applyingKind || this.editMode) return;
            var k = this.destinationKind(id);
            if (k !== this.kind) this.kind = k;      // təyinat 16/17 seçiləndə Növ avtomatik dəyişir
        }
    },
    created: function () {
        if (this.editMode) this.loadForEdit(this.params.id);
        else this.applyKindRules('object');
    },
    methods: {
        newParty: function () { return { kind: 'physical', idPin: '', idSerial: '', tin: '', id: '', name: '', loading: false, disabled: false }; },
        party: function (role) { return role === 'applicant' ? this.applicant : this.customer; },
        destinationKind: function (id) {
            id = Number(id);
            if (id === this.PRIVATE_DEST) return 'private';
            if (id === this.ILLEGAL_DEST) return 'illegal';
            return 'object';
        },
        applyKindRules: function (kind) {
            this._applyingKind = true;
            var self = this;
            if (kind === 'private') { this.m.destinationId = this.PRIVATE_DEST; this.destinationLocked = true; }
            else if (kind === 'illegal') { this.m.destinationId = this.ILLEGAL_DEST; this.destinationLocked = true; }
            else {
                this.destinationLocked = false;
                if (this.destinationKind(this.m.destinationId) !== 'object') this.m.destinationId = '';
            }
            ['applicant', 'customer'].forEach(function (role) {
                var p = self.party(role);
                if (kind === 'illegal') { self.setUnknown(role); p.disabled = true; }
                else if (kind === 'private') { p.disabled = (role === 'customer'); if (role === 'customer') self.clearParty(role); }
                else { p.disabled = false; }
            });
            this.$nextTick(function () { self._applyingKind = false; });
        },
        setUnknown: function (role) { var p = this.party(role); p.id = this.UNKNOWN_CUSTOMER; p.name = 'Məlum deyil'; p.idPin = ''; p.idSerial = ''; p.tin = ''; },
        clearParty: function (role) { var p = this.party(role); p.id = ''; p.name = ''; },
        async loadForEdit(id) {
            this.loading = true;
            var o = window.MOCK.objects.find(function (x) { return x.Id === Number(id); });
            await new Promise(function (r) { setTimeout(r, 150); });
            if (o) {
                var f = function (v) { v = (v == null ? '' : String(v)).trim(); return v === '+' || v === '1' || v === 'true'; };
                this.m.objectName = o.ObjectName === ('Obyekt № ' + o.Id) ? '' : o.ObjectName;
                this.m.districtId = o.DistrictId || '';
                this.m.address = o.Address || '';
                this.m.destinationId = o.DestinationId || '';
                this.m.financeSourceId = o.FinanceSourceId || '';
                this.m.contractorName = o.ContractorName || '';
                this.m.registrationTypeId = o.RegistrationTypeId || '';
                this.m.startDate = (o.StartDate || '').slice(0, 10);
                this.m.endDate = (o.CompletedAt || '').slice(0, 10);
                for (var n = 1; n <= 6; n++) this.m['workPurpose' + n] = f(o['WorkPurpose' + n]);
                this.m.isCoastal = f(o.IsCoastal); this.m.isLiberatedArea = f(o.IsLiberatedArea);
                if (o.ApplicantId) { this.applicant.id = o.ApplicantId; this.applicant.name = o.ApplicantName || ''; }
                if (o.CustomerId) { this.customer.id = o.CustomerId; this.customer.name = o.CustomerName || ''; }
                this.kind = { 1: 'object', 2: 'private', 3: 'illegal' }[o.ObjectTypeId] || 'object';
            }
            this.loading = false;
        },
        async queryParty(role) {
            var p = this.party(role);
            if (p.disabled) return;
            if (this.kind === 'illegal') { toastr.warning('Qanunsuz obyekt üçün sifarişçi/sahib sorğulanmır'); return; }
            if (p.kind === 'physical') {
                if (!this.iamasActive) { toastr.warning('İAMAS servisi aktiv deyil'); return; }
                if (!p.idPin || !p.idSerial) { toastr.warning('FİN və seriya nömrəsi qeyd olunmalıdır'); return; }
            } else if (!p.tin) { toastr.warning('VÖEN qeyd olunmalıdır'); return; }
            p.loading = true; p.id = ''; p.name = '';
            try {
                var res = await window.API.post('/Objects/CreateObjectCustomer', { role: role, customerKind: p.kind, idPin: p.idPin, idSerialNumber: p.idSerial, tin: p.tin });
                p.id = (res && res.id) || Math.floor(Math.random() * 90000 + 1000);
                p.name = (res && res.name) || (p.kind === 'physical' ? 'Nümunə Şəxs (' + p.idPin + ')' : '"Nümunə" MMC (VÖEN ' + p.tin + ')');
                toastr.success((role === 'applicant' ? 'Sifarişçi' : 'Sahib') + ' əlavə edildi');
            } catch (e) { toastr.error('Məlumat sorğulanmadı'); }
            finally { p.loading = false; }
        },
        useGps: function () {
            var self = this;
            if (!navigator.geolocation) { toastr.warning('GPS dəstəklənmir'); return; }
            navigator.geolocation.getCurrentPosition(function (pos) {
                self.m.address = (self.m.address ? self.m.address + ' ' : '') + '(' + pos.coords.latitude.toFixed(5) + ', ' + pos.coords.longitude.toFixed(5) + ')';
                toastr.success('Koordinat ünvana əlavə edildi');
            }, function () { toastr.error('Koordinat alınmadı'); });
        },
        // Inspector saveObjectFromPopup ilə eyni validasiya sırası/mesajları
        validate: function () {
            var m = this.m, dest = Number(m.destinationId) || 0, W = toastr.warning;
            if (this.applicant.name && !this.applicant.id) { W('Sifarişçi yenidən sorğulanmalıdır'); return false; }
            if (this.customer.name && !this.customer.id) { W('Sahib yenidən sorğulanmalıdır'); return false; }
            if (!String(m.objectName || '').trim()) { W('Obyektin adı qeyd olunmalıdır'); return false; }
            if (!Number(m.districtId)) { W('Bölgə seçilməlidir'); return false; }
            if (!dest) { W('Təyinat seçilməlidir'); return false; }
            if (this.kind === 'object' && dest === this.ILLEGAL_DEST) { W('Bu təyinata tip "Qanunsuz" seçilməlidir'); return false; }
            if (this.kind === 'object' && dest === this.PRIVATE_DEST) { W('Bu təyinata tip "Fərdi ev" seçilməlidir'); return false; }
            if (this.kind === 'private' && dest !== this.PRIVATE_DEST) { W('Fərdi ev üçün təyinat düzgün deyil'); return false; }
            if (this.kind === 'illegal' && dest !== this.ILLEGAL_DEST) { W('Qanunsuz obyekt üçün təyinat düzgün deyil'); return false; }
            if (!Number(m.financeSourceId)) { W('M/M seçilməlidir'); return false; }
            if (!Number(m.registrationTypeId)) { W('Qeydəalma seçilməlidir'); return false; }
            if (![1, 2, 3, 4, 5, 6].some(function (n) { return m['workPurpose' + n]; })) { W('İşin təyinatı seçilməyib'); return false; }
            return true;
        },
        async save() {
            if (this.saving || !this.validate()) return;
            this.saving = true;
            var payload = Object.assign({ id: this.editMode ? Number(this.params.id) : 0, applicantId: this.applicant.id || null, customerId: this.customer.id || null }, this.m);
            try {
                await window.API.post(this.editMode ? '/Objects/UpdateObject' : '/Objects/CreateObject', payload);
                toastr.success(this.editMode ? 'Obyekt yeniləndi' : 'Obyekt yaradıldı');
                this.editMode ? (location.hash = '/object/' + this.params.id) : this.$emit('go', 'objects');
            } catch (e) { toastr.error('Yadda saxlanmadı'); }
            finally { this.saving = false; }
        }
    },
    template: `
    <div class="obj-form">
        <div v-if="loading" class="u-center u-muted" class="form-loading"><i class="fa-light fa-spinner fa-spin"></i> Yüklənir...</div>
        <template v-else>
        <!-- Obyekt məlumatları -->
        <fieldset class="ofs">
            <legend>Obyekt məlumatları</legend>
            <div class="field">
                <label>Növ</label>
                <div class="segmented">
                    <button type="button" :class="{active:kind==='object'}" disabled title="Növ təyinat seçiminə görə avtomatik təyin olunur">Obyekt</button>
                    <button type="button" :class="{active:kind==='private'}" :disabled="editMode" @click="kind='private'">Fərdi ev</button>
                    <button type="button" :class="{active:kind==='illegal'}" :disabled="editMode" @click="kind='illegal'">Qanunsuz</button>
                </div>
            </div>
            <div class="field"><label>Obyektin adı *</label><input class="input" v-model="m.objectName" placeholder="Obyektin adı"></div>
        </fieldset>

        <!-- Sifarişçi / Sahib -->
        <fieldset class="ofs" v-for="role in ['applicant','customer']" :key="role" :class="{'ofs--off': party(role).disabled}">
            <legend>{{ role==='applicant' ? 'Sifarişçi' : 'Sahib' }}</legend>
            <div class="segmented u-mb">
                <button v-for="k in partyKinds" :key="k.id" :class="{active:party(role).kind===k.id}" :disabled="party(role).disabled" @click="party(role).kind=k.id">{{ k.name }}</button>
            </div>
            <div class="grid-2" v-if="party(role).kind==='physical'">
                <div class="field"><label>Ş/V FİN</label><input class="input" maxlength="7" :disabled="party(role).disabled" v-model="party(role).idPin" placeholder="7 simvol"></div>
                <div class="field"><label>Ş/V Seriya və №-si</label><input class="input" maxlength="12" :disabled="party(role).disabled" v-model="party(role).idSerial" placeholder="AZE0000000"></div>
            </div>
            <div class="field" v-else><label>VÖEN</label><input class="input" maxlength="10" :disabled="party(role).disabled" v-model="party(role).tin" placeholder="10 rəqəm"></div>
            <div class="u-row g-8">
                <button class="btn btn--accent u-grow" :disabled="party(role).disabled || party(role).loading" @click="queryParty(role)">
                    <i class="fa-light" :class="party(role).loading ? 'fa-spinner fa-spin' : 'fa-magnifying-glass'"></i>Sorğula
                </button>
            </div>
            <div class="field u-mt">
                <label>Gələn nəticə</label>
                <div class="u-row g-8">
                    <input class="input u-grow" readonly :value="party(role).name" placeholder="—">
                    <button class="btn btn--outline" :disabled="party(role).disabled" @click="clearParty(role)" title="Təmizlə"><i class="fa-light fa-xmark"></i></button>
                </div>
            </div>
        </fieldset>

        <!-- Ünvan / təsnifat -->
        <fieldset class="ofs">
            <legend>Ünvan və təsnifat</legend>
            <div class="grid-2">
                <div class="field"><label>Bölgə *</label>
                    <select class="select" v-model="m.districtId"><option value="">Seçin</option><option v-for="d in lk.districts" :key="d.id" :value="d.id">{{ d.name }}</option></select>
                </div>
                <div class="field"><label>Ünvan</label><input class="input" v-model="m.address" placeholder="Ünvan"></div>
                <div class="field"><label>Təyinat *</label>
                    <select class="select" v-model="m.destinationId" :disabled="destinationLocked"><option value="">Seçin</option><option v-for="d in lk.destinations" :key="d.id" :value="d.id">{{ d.name }}</option></select>
                </div>
                <div class="field"><label>M / M <span class="u-muted">(Maliyyə mənbəyi)</span></label>
                    <select class="select" v-model="m.financeSourceId"><option value="">Seçin</option><option v-for="fs in lk.financeSources" :key="fs.id" :value="fs.id">{{ fs.name }}</option></select>
                </div>
                <div class="field"><label>Podratçı</label><input class="input" v-model="m.contractorName" placeholder="Podratçı"></div>
                <div class="field"><label>Qeydəalma</label>
                    <select class="select" v-model="m.registrationTypeId"><option value="">Seçin</option><option v-for="r in lk.registrationTypes" :key="r.id" :value="r.id">{{ r.name }}</option></select>
                </div>
                <div class="field"><label>Başlama vaxtı</label><input type="date" class="input" v-model="m.startDate"></div>
                <div class="field"><label>Sona çatma vaxtı</label><input type="date" class="input" v-model="m.endDate"></div>
            </div>
            <button class="btn btn--ghost btn--sm" @click="useGps"><i class="fa-light fa-location-crosshairs"></i>Cari koordinatı ünvana əlavə et</button>
        </fieldset>

        <!-- İşin təyinatı -->
        <fieldset class="ofs">
            <legend>İşin təyinatı</legend>
            <div class="check-grid">
                <label v-for="w in workPurposes" :key="w[0]" class="check"><input type="checkbox" v-model="m[w[0]]"><span>{{ w[1] }}</span></label>
                <label class="check"><input type="checkbox" v-model="m.isCoastal"><span>Sahilyanı</span></label>
                <label class="check"><input type="checkbox" v-model="m.isLiberatedArea"><span>İşğaldan azad</span></label>
            </div>
        </fieldset>

        <div class="obj-form__actions">
            <button class="btn btn--brand u-grow btn--lg" :disabled="saving" @click="save">
                <i class="fa-light" :class="saving ? 'fa-spinner fa-spin' : 'fa-floppy-disk'"></i>{{ saving ? 'Saxlanılır...' : 'Yadda saxla' }}
            </button>
            <button class="btn btn--outline btn--lg" @click="editMode ? (location.hash='/object/'+params.id) : $emit('go','objects')">Bağla</button>
        </div>
        </template>
    </div>`
});
