import { sql } from 'drizzle-orm';
import * as t from 'drizzle-orm/pg-core';
import { timestamps } from '../timestamps';
import { users } from './auth';
import { municipalities, parishes, states } from './general';

// Tabla surveys
export const surveys = t.pgTable(
  'surveys',
  {
    id: t.serial('id').primaryKey(),
    title: t.text('title').notNull(),
    description: t.text('description').notNull(),
    targetAudience: t.varchar('target_audience', { length: 50 }).notNull(),
    closingDate: t.date('closing_date'),
    published: t.boolean('published').notNull(),
    questions: t.jsonb('questions').notNull(),
    ...timestamps,
  },
  (surveys) => ({
    surveysIndex: t.index('surveys_index_00').on(surveys.title),
  }),
);

export const answersSurveys = t.pgTable(
  'answers_surveys',
  {
    id: t.serial('id').primaryKey(),
    surveyId: t
      .integer('survey_id')
      .references(() => surveys.id, { onDelete: 'cascade' }),
    userId: t
      .integer('user_id')
      .references(() => users.id, { onDelete: 'cascade' }),
    answers: t.jsonb('answers').notNull(),
    ...timestamps,
  },
  (answers) => ({
    answersIndex: t.index('answers_index_00').on(answers.answers),
    answersIndex01: t.index('answers_index_01').on(answers.surveyId),
    answersIndex02: t.index('answers_index_02').on(answers.userId),
  }),
);

// Tabla training_surveys
export const trainingSurveys = t.pgTable(
  'training_surveys',
  {
    // === 1. IDENTIFICADORES Y DATOS DE VISITA ===
    id: t.serial('id').primaryKey(),
    coorFullName: t.text('coor_full_name').notNull(),
    visitDate: t.timestamp('visit_date').notNull(),
    coorPhone: t.text('coor_phone'),

    // === 2. UBICACIÓN (Claves Foráneas - Nullables) ===
    state: t
      .integer('state')
      .references(() => states.id, { onDelete: 'set null' }),
    municipality: t
      .integer('municipality')
      .references(() => municipalities.id, { onDelete: 'set null' }),
    parish: t
      .integer('parish')
      .references(() => parishes.id, { onDelete: 'set null' }),

    // === 3. DATOS DE LA OSP (Organización Socioproductiva) ===
    ospType: t.text('osp_type').notNull(), // UPF, EPS, etc.
    ecoSector: t.text('eco_sector').notNull().default(''),
    productiveSector: t.text('productive_sector').notNull().default(''),
    centralProductiveActivity: t
      .text('central_productive_activity')
      .notNull()
      .default(''),
    mainProductiveActivity: t
      .text('main_productive_activity')
      .notNull()
      .default(''),
    productiveActivity: t.text('productive_activity').notNull(),
    productiveActivityOther: t.text('productive_activity_other').default(''),
    ospRif: t.text('osp_rif'),
    ospName: t.text('osp_name'),
    companyConstitutionYear: t.integer('company_constitution_year').notNull(),
    currentStatus: t.text('current_status').notNull().default('ACTIVA'),
    infrastructureMt2: t.text('infrastructure_mt2').notNull().default(''),
    hasTransport: t.boolean('has_transport').notNull().default(false),
    structureType: t.text('structure_type').notNull().default(''),
    isOpenSpace: t.boolean('is_open_space').notNull().default(false),
    paralysisReason: t.text('paralysis_reason'),
    equipmentList: t.jsonb('equipment_list').notNull().default([]),
    productionList: t.jsonb('production_list').notNull().default([]),
    productList: t.jsonb('product_list').notNull().default([]),
    ospAddress: t.text('osp_address').notNull(),
    ospGoogleMapsLink: t.text('osp_google_maps_link').notNull().default(''),
    communeName: t.text('commune_name').notNull().default(''),
    siturCodeCommune: t.text('situr_code_commune').notNull(),
    communeRif: t.text('commune_rif').notNull().default(''),
    communeSpokespersonName: t
      .text('commune_spokesperson_name')
      .notNull()
      .default(''),
    communeSpokespersonCedula: t.text('commune_spokesperson_cedula'),
    communeSpokespersonRif: t.text('commune_spokesperson_rif'),
    communeSpokespersonPhone: t
      .text('commune_spokesperson_phone')
      .notNull()
      .default(''),
    communeEmail: t.text('commune_email'),
    communalCouncil: t.text('communal_council').notNull(),
    siturCodeCommunalCouncil: t.text('situr_code_communal_council').notNull(),
    communalCouncilRif: t.text('communal_council_rif').notNull().default(''),
    communalCouncilSpokespersonName: t
      .text('communal_council_spokesperson_name')
      .notNull()
      .default(''),
    communalCouncilSpokespersonCedula: t.text(
      'communal_council_spokesperson_cedula',
    ),
    communalCouncilSpokespersonRif: t.text('communal_council_spokesperson_rif'),
    communalCouncilSpokespersonPhone: t
      .text('communal_council_spokesperson_phone')
      .notNull()
      .default(''),
    communalCouncilEmail: t
      .text('communal_council_email')
      .notNull()
      .default(''),
    ospResponsibleFullname: t.text('osp_responsible_fullname').notNull(),
    ospResponsibleCedula: t.text('osp_responsible_cedula').notNull(),
    ospResponsibleRif: t.text('osp_responsible_rif'),
    civilState: t.text('civil_state'),
    ospResponsiblePhone: t.text('osp_responsible_phone').notNull(),
    ospResponsibleEmail: t.text('osp_responsible_email'),
    familyBurden: t.integer('family_burden'),
    numberOfChildren: t.integer('number_of_children'),
    generalObservations: t.text('general_observations'),

    // === 4. DATOS DE DISTRIBUCIÓN Y EXPORTACIÓN ===
    internalDistributionZone: t.text('internal_distribution_zone'),
    isExporting: t.boolean('is_exporting').notNull().default(false),
    externalCountry: t.text('external_country'),
    externalCity: t.text('external_city'),
    externalDescription: t.text('external_description'),
    externalQuantity: t.text('external_quantity'),
    externalUnit: t.text('external_unit'),

    // === 5. MANO DE OBRA ===
    womenCount: t.integer('women_count').notNull().default(0),
    menCount: t.integer('men_count').notNull().default(0),

    // Fotos
    photo1: t.text('photo1'),
    photo2: t.text('photo2'),
    photo3: t.text('photo3'),
    // informacion del usuario que creo y actualizo el registro
    createdBy: t
      .integer('created_by')
      .references(() => users.id, { onDelete: 'cascade' }),
    updatedBy: t
      .integer('updated_by')
      .references(() => users.id, { onDelete: 'cascade' }),
    ...timestamps,
  },
  (trainingSurveys) => ({
    trainingSurveysIndex: t
      .index('training_surveys_index_00')
      .on(trainingSurveys.coorFullName),
  }),
);

export const viewSurveys = t.pgView('v_surveys', {
  surverId: t.integer('survey_id'),
  title: t.text('title'),
  description: t.text('description'),
  created_at: t.timestamp('created_at'),
  closingDate: t.date('closing_date'),
  targetAudience: t.varchar('target_audience'),
})
  .as(sql`select id as survey_id, title, description, created_at, closing_date, target_audience from surveys
where published = true`);
