import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document, Types } from 'mongoose';
import { ObjectType, Field, ID, Int } from '@nestjs/graphql';
import { Base, ChangableBase } from '@/models/base.model';
import { Person } from '@/models/person.model';
import { Company } from '@/models/company.model';

@ObjectType()
@Schema({ timestamps: true })
export class BuildIban extends ChangableBase {

    @Field(() => ID)
    readonly _id: string;

    @Field()
    @Prop({ required: true })
    iban: string;

    @Field()
    @Prop({ required: true })
    startDate: Date;

    @Field()
    @Prop({ required: true })
    stopDate: Date;

    @Field()
    @Prop({ required: true, default: 'TR0000000000000' })
    bankCode: string;

    @Field()
    @Prop({ required: true, default: '????' })
    xcomment: string;

}

@ObjectType()
export class BuildResponsible {

    @Field(() => ID)
    @Prop({ type: Types.ObjectId, ref: Company.name, required: true })
    company: Types.ObjectId;

    @Field(() => ID)
    @Prop({ type: Types.ObjectId, ref: Person.name, required: true })
    person: Types.ObjectId;

}

@ObjectType()
export class BuildInfo {

    @Field()
    @Prop({ required: true })
    govAddressCode: string;

    @Field()
    @Prop({ required: true })
    buildName: string;

    @Field()
    @Prop({ required: true })
    buildNo: string;

    @Field(() => Int)
    @Prop({ required: true })
    maxFloor: number;

    @Field(() => Int)
    @Prop({ required: true })
    undergroundFloor: number;

    @Field()
    @Prop({ required: true })
    buildDate: Date;

    @Field()
    @Prop({ required: true })
    decisionPeriodDate: Date;

    @Field()
    @Prop({ required: true })
    taxNo: string;

    @Field(() => Int)
    @Prop({ required: true })
    liftCount: number;

    @Field()
    @Prop({ required: true })
    heatingSystem: boolean;

    @Field()
    @Prop({ required: true })
    coolingSystem: boolean;

    @Field()
    @Prop({ required: true })
    hotWaterSystem: boolean;

    @Field(() => Int)
    @Prop({ required: true })
    blockServiceManCount: number;

    @Field(() => Int)
    @Prop({ required: true })
    securityServiceManCount: number;

    @Field(() => Int)
    @Prop({ required: true })
    garageCount: number;

    @Field(() => Int)
    @Prop({ required: true })
    managementRoomId: number;

}

@ObjectType()
@Schema({ timestamps: true })
export class Build extends Base {

    @Field(() => ID)
    @Prop({ type: Types.ObjectId, ref: 'BuildType', required: true })
    buildType: Types.ObjectId;

    @Field()
    @Prop({ required: true, unique: true })
    collectionToken: string;

    @Field(() => BuildInfo)
    @Prop({ type: BuildInfo, required: true })
    info: BuildInfo;

    @Field(() => ID, { nullable: true })
    @Prop({ type: Types.ObjectId, ref: 'BuildSites' })
    site?: Types.ObjectId;

    @Field(() => ID, { nullable: true })
    @Prop({ type: Types.ObjectId, ref: 'BuildAddress' })
    address?: Types.ObjectId;

    @Field(() => [ID], { nullable: true })
    @Prop({ type: [{ type: Types.ObjectId, ref: 'BuildArea' }] })
    areas?: Types.ObjectId[];

    @Field(() => [BuildIban], { nullable: true })
    @Prop({ type: [BuildIban] })
    ibans?: BuildIban[];

    @Field(() => [BuildResponsible], { nullable: true })
    @Prop({ type: [BuildResponsible] })
    responsibles?: BuildResponsible[];

}

export type BuildIbanDocument = BuildIban & Document;
export const BuildIbanSchema = SchemaFactory.createForClass(BuildIban);

export type BuildDocument = Build & Document;
export const BuildSchema = SchemaFactory.createForClass(Build);
